2016-04-11 8 views
-1

DrawingArea.hppDraw-Signal nicht in gtkmm gefeuert bekommt, wenn abgeleitete Klasse nicht nennen eine übergeordnete Klasse Konstruktor

#ifndef __DRAWINGAREA 
#define __DRAWINGAREA 

#include <gtkmm.h> 

class DrawingArea : public Gtk::DrawingArea 
{ 
public: 
    bool on_my_draw(const Cairo::RefPtr<Cairo::Context>& cr); 

    DrawingArea(GtkDrawingArea* &cobject, const Glib::RefPtr<Gtk::Builder>& builder); 
}; 
#endif // __DRAWINGAREA 

DrawingArea.cpp

#include "DrawingArea.hpp" 

#include <iostream> 

DrawingArea::DrawingArea(GtkDrawingArea* &cobject, const Glib::RefPtr<Gtk::Builder>& builder) 
{ 
    this->signal_draw().connect(sigc::mem_fun(this, &DrawingArea::on_my_draw)); 
} 

bool DrawingArea::on_my_draw(const Cairo::RefPtr<Cairo::Context>& cr) 
{ 
    std::cout << "i am here" << std::endl; 
} 

zusammengestellt Nachdem das in die Anwendung habe ich getestet, dass der DrawingArea Konstruktor tatsächlich gefeuert wird (ich benutze get_widget_derived, um es mit Glade zu verbinden, aber das sollte hier nicht wichtig sein).

Ich würde erwarten, "I am here" zu sehen, wenn ich die Anwendung starte, oder wenn es die DrawingArea neuzeichnen muss, aber es geschieht nicht, aus welchem ​​Grund auch immer.

Trotz der Tatsache, dass der Bereich bereits angezeigt wird, habe ich versucht, show_all_children auf dem Fenster zu starten, dass es ein Teil von ist, aber das hat nicht geholfen.


versucht nun

Um .hpp hinzuzufügen: Hilfe

bool DrawingArea::on_draw(const Cairo::RefPtr<Cairo::Context>& cr) 
{ 
    std::cout << "i am here!!!" << std::endl; 
} 

Das ist nicht:

bool on_draw(const Cairo::RefPtr<Cairo::Context>& cr) override; 

Und .cpp.

Auch habe versucht, false als zweiter Parameter zu connect() zu übergeben, und das hat nicht geholfen.

Antwort

1

Das Problem war ziemlich interessant und ziemlich unterschiedlich zu, was man erwarten kann, also posten ich die Antwort, die ich bekam.

Das Problem war, dass ich das Objekt richtig initialisieren musste. Speziell habe ich den Konstruktor der Superklasse nicht aufgerufen. Ich tun musste:

DrawingArea::DrawingArea(GtkDrawingArea* cobject, const Glib::RefPtr<Gtk::Builder>& builder) 
    : Gtk::DrawingArea(cobject) // <--- this is a very important bit 
{ 
    //... 
} 

Ohne dass nicht nur die Signalverbindung wurde verloren (was verständlich ist, da der gesamte Teil des Objekts, das mit Berufung der benötigten Funktionen beschäftigt war verschwunden), aber auch die außer Kraft gesetzt on_draw funktioniert nicht mehr (und das verstehe ich immer noch nicht).

+0

Beachten Sie, dass dieser Konstruktor nur erforderlich ist, wenn Sie mit Gtk :: Builder eine abgeleitete Klasse erstellen. Es sollte übrigens GtkDrawingArea * cobject, nicht GtkDrawingArea * & cobject sein. Siehe https://developer.gnome.org/gtkmm-tutorial/stable/sec-builder-using-derived-widgets.html.en – murrayc

+0

@murrayc Aber ich habe in meiner Frage gesagt, dass ich mit Glade eine abgeleitete Klasse erstelle . Und ja, Sie haben Recht, es ist nicht notwendig, den ersten Parameter als Referenz zu übergeben. – v010dya

1

Es ist einfacher, nur die Standard-Handler außer Kraft setzen - on_draw(), wie in diesem einfachen Beispiel: https://developer.gnome.org/gtkmm-tutorial/stable/sec-cairo-drawing-lines.html.en#cairo-example-lines

Diese Signale, die oft zurückkehren Bool werden müssen, verbunden „vor“, um für die zusätzlichen Signal-Handler angerufen zu werden: https://developer.gnome.org/gtkmm-tutorial/stable/sec-xeventsignals.html.en#signal-handler-sequence

+0

Hallo, vielen Dank für die Antwort. Aber das hat wirklich nicht geholfen. Ich habe versucht, beides zu tun, und beide scheinen nicht zu schießen. – v010dya