使用 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 上的自动连接信号的主要内容,如果未能解决你的问题,请参考以下文章

通过 GtkBuilder 访问 GtkLabel

Ubuntu 14.04TLA 上的代码块和 Gtkmm

显示条目的值

Golang Gtk+3教程:GtkBuilder使用XML构建UI

gtkmm 3.10.1 中带有 CSS 的 Gtk::Box 样式问题

Ubuntu 11.10 上的 gtkmm-3.0 中缺少文件 application.h