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

  1. 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 .
  2. Carica l'interfaccia utente dal file direttamente con
    auto ui = Gtk::Builder::create_from_file("ui.glade");
    
  3. 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

Glade UI

UI di esempio: simple.glade

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

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");


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow