无法连接到 GTKMM signal_configure_event

Posted

技术标签:

【中文标题】无法连接到 GTKMM signal_configure_event【英文标题】:unable to connect to GTKMM signal_configure_event 【发布时间】:2017-02-26 11:56:33 【问题描述】:

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

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

我对可能出了什么问题感到困惑。正如 GTKMM 文档所说,代码遵循与其他“事件”相同的模式,例如我之前做过的按钮按下:启用事件的 MASK,然后将它的信号连接到我的处理程序。 根据“google”返回的一些内容,我尝试了这里显示的 add_event(...) 和 set_event(...),并在 add/set 调用之前包含了一个“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】:

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?,其中有更详细的解释。

【讨论】:

对。默认处理程序似乎会阻止后续处理程序,因此需要在它之前进行连接。这为我节省了更多时间,所以希望 +1 会在下一个程序员的搜索结果中进一步提升它!但是添加Gdk::STRUCTURE_MASK 是多余的:正如the documentation 所述,“GDK 将为所有新窗口自动启用此掩码。”。 这就是为什么我使用signal_damage_event() 的程序无法编译的原因,如此简单!

以上是关于无法连接到 GTKMM signal_configure_event的主要内容,如果未能解决你的问题,请参考以下文章

图像小部件的 Gtkmm 点击信号

GTKMM/C++ 窗口事件失去/重新获得焦点?

连接到实现信号:奇怪的窗口大小调整行为

FTP总是无法连接到服务器

SQL SERVER2008无法连接到服务器

无法连接到虚拟机怎么解决?怎么解决?