Domanda

Sono relativamente nuovo nella programmazione con QT e ho avuto una domanda. Versione breve:

Come si ereditano i segnali definiti in superclassi?

Sto cercando di sottoclassizzare Qtwidget ben fatti di qualcun altro per cambiare alcuni dei comportamenti predefiniti:

//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)));
    }
};

Il problema è nella linea Qobject :: Connect. Quello che vorrei fare è collegare il segnale di rotazione (da qwt3d_plot.h) a una funzione/slot locale - "mirotationchanged". Tuttavia, ogni volta che lo faccio, a tempo di esecuzione ricevo:

Object :: Connect: Nessun tali segnali matlineplot :: rotitionchanged (doppio, doppio, doppio)

in c: ... matrixvisualization.h. Certo, lo so rotationChanged non è in matrixVisualization.h - è dentro qwt_plot3D.h, ma l'ho pensato da quando ne eredivo da Plot3D Tutto dovrebbe andare bene. Ma, ora che ci penso, poiché il segnale e lo slot sono macro, presumo MOC Non sa/si preoccupa dell'eredità.

Il che mi porta alla mia domanda - poiché MOC e segnali / slot non sembrano sapere dell'eredità, ecc: come posso sottoclassizzare un widget definito da qualche altra parte e accedere ai segnali del widget?

Ho molti esempi su come usare l'incapsulamento per realizzare qualcosa del genere, ma temo di non capire come farlo con l'eredità.

Scusa se questa è una domanda ridicola - mi sento come se mi manca qualcosa di ovvio.

È stato utile?

Soluzione

Immagino che il problema sia l'eredità multipla:

class matLinePlot : public QObject, public Plot3D
...

presumo che Plot3D è una sottoclasse di QObject? In questo caso, dovresti farlo

class matLinePlot : public Plot3D
...

invece.

Altri suggerimenti

Il segnale (x) e lo slot (x) sono macro che generano letterali di stringa. In fase di esecuzione, slot e segnali sono abbinati utilizzando le stringhe confronte di quelli generati.

(Avrei aggiunto un commento al commento di MDEC, ma non ho abbastanza rappresentante)

Credo che funzionerà se il segnale Plot3D :: RotitionChanged è pubblico o protetto. Sei sicuro che il segnale non sia privato?

Modificare:

Anche se non sono riuscito a trovare un riferimento specifico, dovrò concludere che i segnali sono sempre pubblici. Almeno un test che ho fatto qui sembrava indicare che potevo connettermi a un segnale anche se fosse stato dichiarato nella sezione privata di una classe.

Ho anche verificato che un segnale dichiarato in Qobject potrebbe essere collegato usando una sottoclasse di Qobject nell'istruzione Connect in modo che i segnali siano decisamente ereditabili. Come vedo in altre risposte e commenti qui, il problema deve essere altrove.

Errato -> Vedi commenti.

Sto usando Qtopia all'UNI e credo che ricordo qualcuno che diceva qualcosa sulla distanza nel segnale e nei parametri di slot per la connessione.

Prova a usare

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

So che non sembra intuitivo, poiché C ++ non è sensibile allo spazio bianco, tuttavia credo che abbia qualcosa a che fare con un po 'della magia che Qtopia/Qt usa quando si collega segnali e slot. Questo può applicarsi solo a Qtopia, o potrei aver sentito male, ma provalo. Inoltre, i segnali sono pubblici o protetti e hai incluso i file di intestazione appropriati?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top