gtk3
Utilizzo di Glade con l'API Builder
Ricerca…
[C ++] usando Gtk :: Builder in gtkmm
Panoramica
Gtk + supporta un flusso di lavoro in cui il compito della progettazione dell'interfaccia utente e il compito della programmazione sono disaccoppiati. Sebbene gli elementi dell'interfaccia utente come pulsanti, menu, layout, ecc. Possano essere aggiunti direttamente dal codice, questo approccio non solo ingombra il codice, ma rende anche difficile modificare l'interfaccia utente per chiunque tranne il programmatore. Inoltre, alcuni elementi dell'interfaccia vengono utilizzati solo per contenere la struttura del layout e non devono partecipare alla logica, aggiungendoli dal codice lo rende solo più lungo. Invece Glade può essere utilizzato per generare la descrizione dell'interfaccia utente come XML e l'API Gtk + Builder può essere utilizzata per caricare l'interfaccia utente e operare su di essa.
Flusso di lavoro
- Progetta elementi dell'interfaccia utente in Glade utilizzando il trascinamento della selezione. Glade genera un file XML che contiene descrizioni dell'interfaccia utente. Questo può anche essere fatto manualmente scrivendo la sintassi XML corretta e salvandola con un'estensione
.glade
. - Carica l'interfaccia utente dal file direttamente con
auto ui = Gtk::Builder::create_from_file("ui.glade");
- Accedi ai singoli elementi dell'interfaccia utente
// when element doesn't need to be added to another UI element auto ui_elem = Glib::RefPtr<Gtk::Button>::cast_dynamic( ui->get_object("button_UI_id") ); // when element needs to be added to another widget Gtk::Button *btn = nullptr; ui->get_widget<Gtk::Button>("button_UI_id", btn);
Esempio
simple.glade
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.20.0 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<object class="GtkBox" id="cont">
<property name="width_request">200</property>
<property name="height_request">200</property>
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel" id="display_label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="wrap">True</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="scale" value="5"/>
<attribute name="foreground" value="#a4a400000000"/>
</attributes>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="display_button">
<property name="label" translatable="yes">Display Message</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</interface>
simple.cpp
#include <gtkmm/application.h>
#include <gtkmm/applicationwindow.h>
#include <gtkmm/button.h>
#include <gtkmm/label.h>
#include <gtkmm/box.h>
#include <gtkmm/builder.h>
class HelloWindow : public Gtk::ApplicationWindow {
Gtk::Box *cont;
Glib::RefPtr<Gtk::Label> display_label;
Glib::RefPtr<Gtk::Button> display_btn;
Glib::RefPtr<Gtk::Builder> ui;
public:
HelloWindow()
: ui{Gtk::Builder::create_from_file("simple.glade")} {
if(ui) {
ui->get_widget<Gtk::Box>("cont", cont);
display_label = Glib::RefPtr<Gtk::Label>::cast_dynamic(
ui->get_object("display_label")
);
display_btn = Glib::RefPtr<Gtk::Button>::cast_dynamic(
ui->get_object("display_button")
);
if(cont && display_label && display_btn) {
display_btn->signal_clicked().connect(
[this]() {
display_label->set_text("Hello World");
});
add(*cont);
}
}
set_title("Simple Gtk::Builder demo");
set_default_size(400, 400);
show_all();
}
};
int main(int argc, char *argv[]) {
auto app = Gtk::Application::create(
argc, argv,
"org.gtkmm.example.HelloApp"
);
HelloWindow hw;
return app->run(hw);
}
Produzione
Utilizzando Gio :: Resource
Caricare le interfacce utente direttamente dai file .glade
è facile e veloce. Ma quando l'applicazione è impacchettata, le descrizioni dell'interfaccia utente, le icone e altre immagini possono essere raggruppate in pacchetti di risorse . Innanzitutto una descrizione della risorsa deve essere creata come file XML.
resources.xml
<gresources>
<gresource prefix="/unique/prefix/">
<file>icon.png</file>
<!-- text files such as XML can be compressed to save memory -->
<file compressed="true">ui.glade</file>
</gresource>
</gresources>
Quindi creare un file .gresource
separato o un file .c
contenente risorse come dati stringa da collegare come parte dell'applicazione.
# generates separate resource file
glib-compile-resources --target=ui.gresource resources.xml
# generates .c file
glib-compile-resources --generate-source resources.xml
Quindi dal codice dell'applicazione caricare il pacchetto di risorse
// from separate file
auto resource_bundle = Gio::Resource::create_from_file("ui.gresource");
// from stream of bytes in .c file
auto resource_bundle = Glib:wrap(draw_resource_get_resource());
resource_bundle.register_global();
Dal pacchetto di risorse caricare elementi dell'interfaccia utente
auto ui = Gtk::Builder::create_from_resource("/unique/prefix/ui.glade");