2017-02-26 6 views
0

Ich versuche, eine Verbindung zum GTKMM configure_event-Signal herzustellen. Andere Signale wie property_is_active und delete_event funktionieren gut.Verbindung zu GTKMM nicht möglich signal_configure_event

im folgenden Codebeispiel wird kompiliert und ausgeführt, aber wenn ich das Fenster mit der Maus verschiebe oder die Größe verändere, wird der "cout" nicht auf der Konsole angezeigt.

Ich bin verwirrt, was könnte falsch sein. Der Code folgt, wie die GTKMM-Dokumentation sagt, das gleiche Muster wie andere "Ereignisse", wie zum Beispiel das Drücken der Taste, was ich zuvor getan habe: Aktivieren Sie die MASKE des Ereignisses und verbinden Sie das Signal mit meinem Handler. Basierend auf einigen Sachen "google" zurückgegeben, habe ich sowohl das add_event (...) hier gezeigt, auch set_event (...) versucht, und enthalten eine "show()" entweder vor dem Add/Set-Aufruf, in einem bemühen, einige Hinweise in alten Tutorials (möglicherweise von GTK2) zu erfüllen. Es gibt noch andere Beiträge auf verschiedenen Foren darauf hindeutet, Menschen über diesen Punkt bekommen haben, wenn (meist andere Sprachen als C++.

(aktuelle Debian Linux, GTK 3)

Jede Hilfe wäre sehr dankbar.

#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())); 
} 

Antwort

0

connect()connect() ein zweites Argument, das gesetzt werden soll, wenn Ihr Signalhandler vor oder nach dem Standard-Signalhandler aufgerufen werden soll: true bedeutet, dass Ihr Signalhandler nach dem Standard aufgerufen würde, in diesem Fall soll er aufgerufen werden vor und sollte diehinzufügenArgument.

Weitere Informationen finden Sie unter https://developer.gnome.org/glibmm/2.48/classGlib_1_1SignalProxy.html.

Die angepasste Version Ihres Codes mit dem aufgerufenen Signal-Handler ist unten aufgeführt.

#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())); 
} 

Nur als Anmerkung ist es am besten nicht using namespace std; zu verwenden, wie es Namenskonflikte zwischen Namensräumen verursachen kann. Lesen Sie Why is "using namespace std" considered bad practice?, was genauer erklärt.

Verwandte Themen