用 Gtk::Builder 初始化 Gtk::Window 派生的 class
Initialize a Gtk::Window derived class with a Gtk::Builder
我将 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 作为基础 class 并且只是 "run" 我的 class 喜欢:
#include "myclass.h"
int main(int argc, char *argv[])
{
Gtk::Main kit(argc, argv);
MyClass helloworld;
kit.run(loginScreen);
return 0;
}
但我似乎无法弄清楚如何使用构建器 insert/assign 布局到 Gtk::Window 基础 class。我相当确定我需要使用 get_widget_derived 但我似乎无法弄清楚如何在构造函数中使用它(......或者你不能在构造函数中使用它吗?)。例如,将我的 class 定义更改为:
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", ???);
}
创建该基础对象需要函数 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
}
注:此代码未经测试
我将 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 作为基础 class 并且只是 "run" 我的 class 喜欢:
#include "myclass.h"
int main(int argc, char *argv[])
{
Gtk::Main kit(argc, argv);
MyClass helloworld;
kit.run(loginScreen);
return 0;
}
但我似乎无法弄清楚如何使用构建器 insert/assign 布局到 Gtk::Window 基础 class。我相当确定我需要使用 get_widget_derived 但我似乎无法弄清楚如何在构造函数中使用它(......或者你不能在构造函数中使用它吗?)。例如,将我的 class 定义更改为:
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", ???);
}
创建该基础对象需要函数 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
}
注:此代码未经测试