Qt signaux & amp; question d'héritage
Je suis relativement nouveau à la programmation avec Qt et avait une question. Version courte:
Comment puis-je hériter de signaux définis dans les super-classes?
Je suis en train de sous-classe de quelqu'un d'autre bien fait QTWidgets pour modifier le comportement par défaut:
//Plot3D est un QWidget qui définit un signal "rotationChanged" classe matLinePlot : public QObject, public Plot3D { Macro q_object; //etc... public: //etc... //Catch Plot3D du signal "rotationChanged" et de faire de la magie avec elle: void initPlot(){ QObject::connect(this, SIGNAL(rotationChanged( double , double , double )), ce, SLOT(myRotationChanged(double, double, double))); } };
Le problème est dans le QObject::connect ligne. Ce que je voudrais faire est de connecter la rotationChanged SIGNAL (à partir de qwt3D_plot.h) à une fonction locale/à FENTE "myRotationChanged". Cependant, chaque fois que je fais cela, au moment de l'exécution j'obtiens:
Object::connect: No such signal matLinePlot::rotationChanged(double, double, double)
dans C:...\matrixVisualization.h. Bien sûr, je sais que rotationChanged
n'est pas dans matrixVisualization.h
- c'est dans qwt_plot3D.h
mais je pensais que depuis que j'ai hériter de Plot3D
tout devrait bien se passer. Mais, maintenant que j'y pense, depuis de SIGNAUX et de slots sont des macros, je suppose GPM ne sait pas/soins à propos de l'héritage.
Ce qui m'amène à ma question - depuis MOC et les SIGNAUX /SLOTS ne semblent pas savoir à propos de l'héritage, etc: comment puis-je sous-classe d'un widget défini quelque part d'autre et d'accéder au widget de signaux?
J'ai beaucoup d'exemples d'utilisation de l'encapsulation pour accomplir quelque chose comme ça, mais j'ai peur de ne pas comprendre comment le faire avec l'héritage.
Désolé si c'est une question ridicule - j'ai l'impression de rater quelque chose d'évident.
source d'informationauteur Pete
Vous devez vous connecter pour publier un commentaire.
Je crois que le problème est l'héritage multiple:
Je suppose que
Plot3D
est une sous-classe deQObject
? Dans ce cas, vous devriez faireà la place.
SIGNAL(x) et la FENTE(x) sont des macros qui génèrent des littéraux de chaîne. Au moment de l'exécution, les fentes et les signaux sont jumelés à l'aide de la comparaison des chaînes de celles générées littéraux.
(J'aurais ajouté un commentaire à mdec commentaire, mais je n'ai pas assez rep)
Je crois que de travailler si le Plot3D::rotationChanged signal est public ou protégé. Êtes-vous sûr que le signal n'est pas privé?
Edit:
Bien que je ne pouvais pas trouver une référence précise, je vais devoir conclure que les signaux sont toujours publiques. Au moins un test que j'ai fait ici semble indiquer que je pourrais connecter à un signal, même s'il a été déclaré dans la partie privée d'une classe.
J'ai aussi vérifié qu'un signal a déclaré dans QObject pourrait être connectés à l'aide d'une sous-classe de QObject dans la déclaration de connexion de manière signaux sont certainement pouvant être héritées. Comme je le vois dans d'autres réponses et commentaires ici, le problème doit être ailleurs.
Incorrect -> voir les commentaires.
Je suis en utilisant Qtopia à l'Uni et je crois que je me souviens de quelqu'un de dire quelque chose sur l'espacement dans le SIGNAL et le SLOT paramètres pour se connecter.
Essayez d'utiliser
Je sais qu'il ne semble pas intuitif, comme le C++ n'est pas sensible à l'espace, mais je crois qu'il a quelque chose à faire avec un peu de la magie qui Qtopia/QT utilise lors de la connexion des signaux et des slots. Ceci ne peut s'appliquer à Qtopia, ou j'ai peut-être mal entendu, mais lui donner un essai. De plus, ils sont les signaux public ou protégé et avez-vous inclus l'en-tête approprié fichiers?