Инициализируйте производный класс Gtk :: Window с помощью Gtk :: Builder - PullRequest
0 голосов
/ 21 февраля 2019

У меня есть макет Glade, скомпилированный в gresource, который я устанавливаю для объекта Gtk :: Window вручную в моем конструкторе.Упрощенная версия кода, который я сейчас использую, будет выглядеть так:


MyClass::MyClass()
{
    Gtk::Window *window;
    Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_resource("/layouts/mywindow.glade");
    builder->get_widget("myWindow", window);
    window->show();
}

* Примечание: это не мой настоящий код, это просто очень упрощенная версия того, что я делаю.

Я бы хотел использовать Gtk :: Window в качестве базового класса и просто "запустить" мой класс, например:

#include "myclass.h"

int main(int argc, char *argv[])
{
    Gtk::Main kit(argc, argv);

    MyClass helloworld;

    kit.run(loginScreen);

    return 0;
}

Но я не могу понять, как использовать конструктор для вставки /назначить макет базовому классу Gtk :: Window.Я вполне уверен, что мне нужно использовать get_widget_derived, но я не могу понять, как использовать его в конструкторе (... или вы не можете использовать его в конструкторе?).Например, изменив определение моего класса на:

class MyClass : public Gtk::Window
{
public:
    MyClass(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& refBuilder);
}

что я должен добавить в свой конструктор, чтобы поместить макет из компоновщика в базовую Gtk :: Window?

MyClass::MyClass(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& refBuilder)
    : Gtk::Window(cobject)
{
    Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_resource("/layouts/mywindow.glade");
    // What goes here?
    // something like?: builder->get_widget_derived("myWindow", ???);
}

1 Ответ

0 голосов
/ 09 апреля 2019

Функция get_widget_derived понадобится для создания этого базового объекта, поэтому вы не можете отложить его вызов таким способом.Вы можете сделать это с помощью статической функции, которая сгенерирует все для вас

#include "myclass.h"
int main(int argc, char *argv[])
{
    Gtk::Main kit(argc, argv);

    MyClass* helloworld = MyClass::getInstance();

    kit.run(*helloworld);

    return 0;
}

со следующим определением:

MyClass* MyClass::getInstance() // a static function
{
    MyClass* result;
    Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_resource("/layouts/mywindow.glade");
    builder->get_widget_derived("NameOfMyWindow", result);
    return result
}

, и конструктор прост после этого:

MyClass::MyClass(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& refBuilder)
    : Gtk::Window(cobject)
{
    // Start doing stuff, because the object is constructed
}

Примечание: этот код не проверен

...