【发布时间】:2013-12-14 14:41:51
【问题描述】:
在 C 中,我可以使用以下代码自动连接信号:
gtk_builder_connect_signals (builder, NULL)
如何在 C++ 中使用 GTKmm 做到这一点?
【问题讨论】:
-
即使喜欢 c++,我也更喜欢纯 C GTK
在 C 中,我可以使用以下代码自动连接信号:
gtk_builder_connect_signals (builder, NULL)
如何在 C++ 中使用 GTKmm 做到这一点?
【问题讨论】:
在使用 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));
看看这些答案:
【讨论】:
get_widget_derived 允许您在小部件类的构造函数中执行此操作,从而使代码更有条理。
当然可以,混合 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)
【讨论】: