无法连接到GTKMM signal_configure_event

时间:2017-02-26 11:56:33

标签: c++ signals gtkmm

我正在尝试连接到GTKMM configure_event信号。其他信号,如property_is_active和delete_event工作正常。

在下面的代码示例中,它编译并运行,但是当我使用鼠标移动或调整窗口大小时,“cout”不会显示在控制台上。

我对可能出错的事情感到困惑。正如GTKMM文档所说,代码遵循与其他“事件”相同的模式,例如我之前完成的按钮按下:启用事件的MASK,然后将其信号连接到我的处理程序。 基于“google”返回的一些内容,我尝试了此处显示的add_event(...),也尝试了set_event(...),并在添加/设置调用之前包含了“show()”满足旧教程中的一些提示(可能来自GTK2)。在各种论坛上还有其他帖子表明人们已经超越了这一点(主要是C ++以外的语言。

(目前的Debian Linux,GTK 3)

非常感谢任何帮助。

#include <fstream>
#include <istream>
#include <ostream>
#include <iostream>
#include <gdkmm.h>
#include <gtkmm.h>

using namespace std;

class AdjunctWindow : public Gtk::Window {

public:

AdjunctWindow();
~AdjunctWindow();

bool on_configure_changed(GdkEventConfigure* configure_event);
};

AdjunctWindow::AdjunctWindow() {
  add_events(Gdk::STRUCTURE_MASK);
  signal_configure_event().connect( sigc::mem_fun(*this,
    &AdjunctWindow::on_configure_changed));
}

AdjunctWindow::~AdjunctWindow(){
}

bool AdjunctWindow::on_configure_changed(GdkEventConfigure* configure_event) {
 cout << "configure changed\n";
 return false;
}

int main(int argc, char** argv) {
  Gtk::Main kit(argc, argv);
  Gtk::Main::run(*(new AdjunctWindow())); 
}

1 个答案:

答案 0 :(得分:2)

connect()接受第二个参数来设置是否应在默认信号处理程序之前或之后调用信号处理程序。默认值为true,这意味着在默认情况下将调用您的信号处理程序。在这种情况下,您希望之前调用它,并应添加false参数。

有关详细信息,请参阅https://developer.gnome.org/glibmm/2.48/classGlib_1_1SignalProxy.html

调用了调用信号处理程序的代码版本如下所示。

#include <iostream>
#include <gtkmm.h>

class AdjunctWindow : public Gtk::Window {
public:
  AdjunctWindow();
  ~AdjunctWindow();

  bool on_configure_changed(GdkEventConfigure* configure_event);
};

AdjunctWindow::AdjunctWindow() {
  add_events(Gdk::STRUCTURE_MASK);
  signal_configure_event().connect(
    sigc::mem_fun(*this, &AdjunctWindow::on_configure_changed), false);
}

AdjunctWindow::~AdjunctWindow(){
}

bool AdjunctWindow::on_configure_changed(GdkEventConfigure* configure_event) {
 std::cout << "configure changed\n";
 return false;
}

int main(int argc, char** argv) {
  Gtk::Main kit(argc, argv);
  Gtk::Main::run(*(new AdjunctWindow())); 
}

正如注释一样,最好不要使用using namespace std;,因为它可能导致名称空间之间的名称冲突。阅读Why is "using namespace std" considered bad practice?,更详细地解释。