Qt connecter “no such slot” quand le logement certainement n'existe pas
Qt v4.8.0, VC2010 compilateur
J'ai un QMainWindow
en fonction de la classe et je suis en train d'envoyer des signaux impliquant QUuid
Cependant, chaque fois que je le lance j'obtiens les erreurs suivantes:
Object::connect: No such slot MainWindow::on_comp_connected(QUuid) in ..\..\src\mainwindow.cpp:143
Object::connect: (receiver name: 'MainWindow')
C'est de me conduire à la propreté de la fente certainement n'existe pas (c'est dans la moc_)
class MainWindow : public QMainWindow
{
Q_OBJECT
//SNIP private typedefs
public:
MainWindow(QWidget *parent = 0, Qt::WFlags flags = 0);
~MainWindow();
//SNIP public methods
signals:
void testSendQuuid(const QUuid &qcid);
public slots:
void on_comp_connected(const QUuid &qcid);
private:
//SNIP private parts
QOpenAcnController *acnInt; //This is where the signal comes from
};
À la fin de la MainWindow
constructeur (la ligne 143 mentionné) j'ai:
connect(acnInt, SIGNAL(callback_comp_connected(QUuid)),
this, SLOT(on_comp_connected(QUuid)));
Étant donné que le logement est certainement il y a dans le moc_mainwindow.cpp (j'ai vérifié, c'est slot #1), ce qui sur terre pourrait être l'arrêt de la connexion qui se passe?
Si j'essaie de me connecter le testSendQuuid(QUuid)
signal pour le logement, je n'ai pas de tel signal, et aucune fente.
Je ne peux pas pour la vie de me comprendre pourquoi Qt est la négation de l'existence d'une fente qui est plus certainement il!
clean
, Run qmake
, build
séquence? Parfois, le Qt généré make
fichier devient confus.Oui en effet, la première chose que j'ai essayé! J'ai eu quelques occasions où qmake ou moc embrouillés (généralement lors de la promotion d'une classe à un QObject descendant lorsqu'il ne l'était auparavant pas). Dans ce cas, il ne fait pas de différence.
Quelles sont les typedefs?
OriginalL'auteur Richard1403832 | 2012-05-18
Vous devez vous connecter pour publier un commentaire.
Vérifier si si que
moc_mainwindow.cpp
est dans votreBuild Path
. Ou vous utilisez une autre moc_window.cpp fichier. Parce que, par ex: Dans QtCreator, la construction de la source d'un nouveau répertoire de construction. Et aussi il utilise l'ancien moc_cpp fichier(s) si vous essayez d'ouvrir la source dans un emplacement différent.Ce que j'essaie de dire, c'est le moc fichier qui vous vérifié peuvent contenir ces fente définition, mais le compilateur peut-être l'aide d'un autre moc fichier qui a été créé plus tôt.
Ce propre de l'étape n'a normalement pas nettoyer ces moc fichiers, par ex: lorsque vous exportez un projet à partir d'un autre système qui a été construit il y, et de les exécuter nettoyer étape dans votre système, comme ça.
donc, si j'ai un moc_maindwindow.cpp fichier dans mon vuild répertoire des thats la cause de cette erreur? Ou si ti n'est-ce pas? vous n'êtes pas clair. J'ai le même problème et j'ai un moc_mainwindow.cpp dans mon dossier de création. donc dois-je le supprimer ou devrais-je être fine comme elle EST là?
Nettoyez le projet et de le construire. vérifiez le chemin d'accès dans lequel le moc fichiers sont générés et de vérifier si son être supprimé par opération de nettoyage. Sinon supprimer tous les moc de fichiers et de construire. Si vous avez encore cant résoudre copie du projet(seuls les fichiers source et de ne pas construire les binaires) pour un chemin différent et essayer de la création de la source. Encore la problématique, revue de la modification que vous avez fait. Vérifiez également que visual studio a la permission d'écrire sur le bac à partir de répertoires.
OriginalL'auteur ScarCode
J'ai résolu le problème en ajoutant de la macro q_object dans la classe mainwindow.
Merci!!!! Fonctionne comme un charme!
OriginalL'auteur FONQRI
Vous avez besoin
Passage par valeur ne correspond pas à passer une référence const.
Mais je l'ai essayé et il le fait. J'ai créé un minimum de projet avec QtCreator 2.4.1 utilisation de Qt 4.7.4 sur Windows. J'ai ajouté une seule étiquette à la fenêtre principale et modifié MainWindow.cpp comme suit
Et je reçois un uuid sur ma fenêtre principale.
J'ai aussi essayé avec les deux QUuid arguments dans la connexion changé à const QUuid& et qui en fait trop.
De sorte que votre problème doit être construit liés.
Ce n'est pas ça. Ils de "normalisation" de la signature de la connexion, en tournant const références dans des valeurs, car les deux sont compatibles.
Je suis sûr que vous pouvez vous connecter, mais vous êtes sûr que le moc va correspondre?
Quelle sorte de correspondance vous attendez-vous la moc? Il ne correspond pas aux signaux de machines à sous. Il a juste construit le méta-objet de l'information nécessaire pour énumérer les méthodes. Les connexions sont construits au moment de l'exécution et de l'OP est à l'aide de
QObject::connect
, qui est robuste à ces mineurs signature des différences.const T& T équivalent quand il s'agit de signaux et les slots, et il n'y a pas besoin de type const T&, jamais (et c'est encore plus lent à l'exécution, en raison de la normalisation).
OriginalL'auteur Julian