Frage

Ich bin relativ neu im Programmieren mit QT und hatte eine Frage. Kurzversion:

Wie erbe ich in Superklassen definierte Signale?

Ich versuche, QTWIDGETS eines anderen zu subklassen, um einen Teil des Standardverhaltens zu ändern:

//Plot3D is a QWidget that defines a signal "rotationChanged"
class matLinePlot : public QObject, public Plot3D {

    Q_OBJECT;
        //etc...
public:
       //etc...

        //Catch Plot3D's signal "rotationChanged" and do some magic with it:
    void initPlot(){
              QObject::connect(this, SIGNAL(rotationChanged( double , double , double )),
            this, SLOT(myRotationChanged(double, double, double)));
    }
};

Das Problem liegt in der QObject :: Connect -Linie. Was ich gerne tun möchte, ist das rotationChanged Signal (von qwt3d_plot.h) an eine lokale Funktion/einen Slot zu verbinden - "MyrotationChanged". Wenn ich dies jedoch tue, bekomme ich zur Laufzeit:

Objekt :: Connect: Keine solche Signal -Matline -Plot :: RotationChanged (doppelt, doppelt, doppelt)

In C: ... matrixvisualization.h. Natürlich weiß ich das rotationChanged ist nicht in matrixVisualization.h - Es ist in qwt_plot3D.h, aber ich dachte das, seit ich von von Plot3D Alles sollte in Ordnung sein. Aber jetzt, wo ich darüber nachdenke, nehme ich an, da Signal und Slot Makros sind Moc weiß/kümmere dich nicht um Erbschaft.

Was mich zu meiner Frage führt - da MOC und Signale / Slots nicht über Erbschaft usw. Bescheid zu wissen scheinen: Wie kann ich ein Widget unterklagen, das woanders definiert ist, und Zugriff auf die Signale des Widgets erhalten?

Ich habe viele Beispiele dafür, wie man eine Kapselung verwendet, um so etwas zu erreichen, aber ich fürchte, ich verstehe nicht, wie man dies mit Erbschaft macht.

Tut mir leid, wenn dies eine lächerliche Frage ist - ich habe das Gefühl, dass mir etwas Offensichtliches fehlt.

War es hilfreich?

Lösung

Ich denke, das Problem ist das multiple Vererbung:

class matLinePlot : public QObject, public Plot3D
...

Ich nehme das an Plot3D ist eine Unterklasse von QObject? In diesem Fall sollten Sie tun

class matLinePlot : public Plot3D
...

stattdessen.

Andere Tipps

Signal (x) und Slot (x) sind Makros, die String -Literale erzeugen. Zur Laufzeit werden Slots und Signale unter Verwendung von String -Vergleiche der erzeugten Literale übereinstimmen.

(Ich hätte dem Kommentar von MDEC einen Kommentar hinzugefügt, aber ich habe nicht genug Wiederholung)

Ich glaube, das wird funktionieren, wenn das Diagramm :: RotationChanged Signal öffentlich oder geschützt ist. Sind Sie sicher, dass das Signal nicht privat ist?

Bearbeiten:

Obwohl ich keine bestimmte Referenz finden konnte, muss ich zu dem Schluss kommen, dass Signale immer öffentlich sind. Zumindest ein Test, den ich hier gemacht habe, schien darauf hinzudeuten, dass ich mich mit einem Signal verbinden könnte, selbst wenn es im privaten Abschnitt einer Klasse deklariert wurde.

Ich habe auch überprüft, ob ein in QOBjekt deklarierter Signal unter Verwendung einer Unterklasse von QObject in der Connect -Anweisung verbunden werden könnte, sodass die Signale definitiv vererbt werden können. Wie ich hier in anderen Antworten und Kommentaren sehe, muss das Problem woanders sein.

Falsch -> siehe Kommentare.

Ich verwende Qtopia bei UNI und glaube, ich erinnere mich an jemanden, der etwas über den Abstand in den Signal- und Schlitzparametern für die Verbindung sagt.

Versuchen Sie es zu verwenden

QObject::connect(this, SIGNAL(rotationChanged(double,double,double)),
            this, SLOT(myRotationChanged(double,double,double)));

Ich weiß, dass es nicht intuitiv erscheint, da C ++ für Whitespace nicht empfindlich ist, aber ich glaube, es hat etwas mit einigen Magie zu tun, das Qtopia/QT beim Anschließen von Signalen und Slots verwendet. Dies gilt möglicherweise nur für Qtopia, oder ich habe vielleicht falsch gehört, aber probieren Sie es aus. Darüber hinaus sind die Signale öffentlich oder geschützt und haben Sie die entsprechenden Header -Dateien aufgenommen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top