【问题标题】:Auto-connection signals with GtkBuilder but on GTKmm使用 GtkBuilder 但在 GTKmm 上的自动连接信号
【发布时间】:2013-12-14 14:41:51
【问题描述】:

C 中,我可以使用以下代码自动连接信号:

gtk_builder_connect_signals (builder, NULL)

如何在 C++ 中使用 GTKmm 做到这一点?

【问题讨论】:

  • 即使喜欢 c++,我也更喜欢纯 C GTK

标签: c++ c gtk gtkmm


【解决方案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://stackoverflow.com/a/3191472/1673000

https://stackoverflow.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++ 方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
  • 2017-12-21
  • 1970-01-01
相关资源
最近更新 更多