2017-02-26 45 views
0

我試圖連接到gtkmm的configure_event信號。其他信號,如property_is_active和delete_event正常工作。無法連接到gtkmm的signal_configure_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())); 
} 

回答

0

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?更詳細的解釋。