使用Gtk :: Builder初始化Gtk :: Window派生类

时间:2019-02-21 04:40:34

标签: c++ gtkmm gtkmm3

我将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 :(得分:1)

将需要函数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
}

注意:此代码未经测试