使用 GtkBuilder 但在 GTKmm 上的自动连接信号
Posted
技术标签:
【中文标题】使用 GtkBuilder 但在 GTKmm 上的自动连接信号【英文标题】:Auto-connection signals with GtkBuilder but on GTKmm 【发布时间】:2013-12-14 14:41:51 【问题描述】:在 C 中,我可以使用以下代码自动连接信号:
gtk_builder_connect_signals (builder, NULL)
如何在 C++ 中使用 GTKmm 做到这一点?
【问题讨论】:
即使喜欢 c++,我也更喜欢纯 C GTK 【参考方案1】:在使用 gtkmm 时,您不能使用 Glade 连接信号,您需要手动进行。
Glib::RefPtr builder = Gtk::Builder::create_from_file("glade_file.ui");
Gtk::Window *window1 = 0;
builder->get_widget("window1", window1);
Gtk::Button *button1 = 0;
builder->get_widget("button1", button1);
// get other widgets
...
button1->signal_clicked().connect(sigc::mem_fun(*this, &button1_clicked));
看看这些答案:
https://***.com/a/3191472/1673000
https://***.com/a/1637058/1673000
【讨论】:
这是正确的方法。我认为没有任何捷径可以将类方法连接到 glade 信号处理程序。 @sjsam 还有一个有趣的功能get_widget_derived
允许您在小部件类的构造函数中执行此操作,从而使代码更有条理。【参考方案2】:
当然可以,混合 C 和 C++ 代码并没有错。
这是一个示例代码,假设信号处理程序 onComboBoxSelectedItemChange 是从 GtkComboBox 上的空地设置的。
#include <gtkmm.h>
#include <string>
namespace GUI
int init()
auto app = Gtk::Application::create();
Glib::RefPtr<Gtk::Builder> builder = Gtk::Builder::create_from_file("./res/GUI.glade");
gtk_builder_connect_signals(builder->gobj(), NULL);
Gtk::Window* mainWindow = nullptr;
builder->get_widget("mainWindow", mainWindow);
return app->run(*mainWindow);
extern "C"
void onComboBoxSelectedItemChange(GtkComboBox *widget, gpointer user_data)
int selectedIndex = gtk_combo_box_get_active(widget);
Gtk::MessageDialog dialog(std::to_string(selectedIndex).c_str());
dialog.run();
int main()
return GUI::init();
你可以使用
g++ -rdynamic -std=c++11 test.cpp $(pkg-config --cflags --libs gtkmm-3.0)
【讨论】:
`混合C和C++代码没有错。`。没错,但是在编写和链接普通的老式 C 风格函数的过程中,您牺牲了某些 C++ 优势,例如成员函数的代码局部性(以及与之相关的性能优势)。当然,您有某些解决方法,但我想更好的选择是将信号手动连接到已接受答案中提到的 C++ 方法。以上是关于使用 GtkBuilder 但在 GTKmm 上的自动连接信号的主要内容,如果未能解决你的问题,请参考以下文章
Golang Gtk+3教程:GtkBuilder使用XML构建UI