Qt-connect "no such slot", wenn slot definitiv nicht vorhanden
Qt v4.8.0, VC2010 compiler
Ich habe eine QMainWindow
Klasse und ich bin versucht, senden Sie Signale mit QUuid
Jedoch, jedes mal, wenn ich es bekomme ich den Fehler:
Object::connect: No such slot MainWindow::on_comp_connected(QUuid) in ..\..\src\mainwindow.cpp:143
Object::connect: (receiver name: 'MainWindow')
Es treibt mich Töpfchen als der slot definitiv nicht existieren (es ist die 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
};
Am Ende der MainWindow
Konstruktor (Zeile 143 erwähnt) habe ich:
connect(acnInt, SIGNAL(callback_comp_connected(QUuid)),
this, SLOT(on_comp_connected(QUuid)));
Gegeben, dass der Schlitz ist definitiv es in der moc_mainwindow.cpp (habe ich geprüft, es ist slot #1), was auf der Erde könnte beenden der Verbindung passiert?
Wenn ich versuche zu verbinden, die testSendQuuid(QUuid)
signal an den slot, bekomme ich kein solches signal und keine solchen Steckplatz, wie gut.
Kann ich nicht für das Leben von mir herauszufinden, warum Qt ist die Leugnung der Existenz von einem slot, der die meisten auf jeden Fall gibt es!
clean
, Run qmake
, build
Sequenz? Manchmal ist die Qt-generiert make
Datei verwechselt wird.Ja, in der Tat, das erste, was ich versucht habe! Ich habe ein paar Gelegenheiten, wo qmake oder moc verwirrt (in der Regel bei der Förderung einer Klasse zu einer QObject abgeleitete wenn es vorher nicht war). In diesem Fall machte es keinen Unterschied.
Was sind diese privaten typedefs?
InformationsquelleAutor Richard1403832 | 2012-05-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kontrollieren, ob, ob, dass
moc_mainwindow.cpp
ist in IhremBuild Path
. Oder Sie sind mit einigen anderen moc_window.cpp Datei. Weil, für die ex: QtCreator, es zu bauen die Quelle, um eine neue build-Verzeichnis. Und auch er verwendet einen alten moc_cpp Datei(en), wenn Sie versuchen, öffnen Sie die Quelle an einem anderen Ort.Was ich versuche zu sagen ist, dass die moc-Datei, die Sie überprüft haben können, enthalten diejenigen, die slot-definition, aber der compiler möglicherweise mit einigen anderen moc-Datei, die zuvor erstellt wurde.
Diese saubere Schritt normalerweise nicht reinigen, diese moc-Dateien, für ex: wenn Sie ein Projekt exportieren aus einem anderen system, dort bauen und ausführen reinigen Schritt in Ihrem system, wie, dass.
also wenn ich einen moc_maindwindow.cpp die Datei in meinem vuild Verzeichnis das ist die Ursache für diesen Fehler? Oder wenn ti nicht da ist? Sie sind nicht so klar. Ich habe das gleiche problem und ich habe eine moc_mainwindow.cpp in meinem build-Ordner. also sollte ich es löschen, oder sollte ich in Ordnung sein, da es da IST?
Reinigen Sie das Projekt und kompilieren Sie es. überprüfen Sie den Pfad, in dem die moc-Dateien werden erzeugt und dort überprüfen, ob die immer gelöscht sauberen Betrieb. Andernfalls löschen Sie alle moc-Dateien und bauen. Wenn Sie kann immer noch nicht lösen, es zu kopieren, das Projekt(nur die Quelldateien und keine Binärdateien), um einen anderen Pfad und versuchen Sie es erstellen der Datenquelle. Noch problematisch ist, überprüfen Sie die änderung, die Sie getan haben. Prüfen Sie auch, ob visual studio hat die Schreibberechtigung auf die bin Verzeichnisse.
InformationsquelleAutor ScarCode
Ich das problem gelöst, durch hinzufügen Q_OBJECT-makro in der mainwindow-Klasse.
InformationsquelleAutor FONQRI
Müssen Sie
Pass-by-value sollte nicht mit übergeben, eine const-Referenz.
Aber ich habe es ausprobiert und es funktioniert. Erstellt habe ich ein minimal-Projekt mit QtCreator 2.4.1 Verwendung von Qt 4.7.4 auf Windows. Ich fügte hinzu, eine einzige label des Hauptfensters angezeigt und geändert werden MainWindow.cpp wie folgt
Und ich bekomme eine uuid auf meinem Haupt-Fenster.
Ich habe auch versucht mit den beiden QUuid Argumente in der connect changed const QUuid& und das klappte auch.
Also dein problem sein muss, bauen verwandt.
Das ist es nicht. Sie 'normalisieren' die Signatur für die Verbindung, drehen const-Referenzen in Werte, da die beiden kompatibel sind.
Ich bin sicher, Sie können schließen Sie Sie, aber sind Sie sicher, dass die moc passen zu Ihnen?
Welche Art von matching-erwarten Sie, dass die moc zu tun? Es entspricht nicht der Signale an den slots. Es baut einfach die meta-Objekt-Informationen benötigt, um die enumerate-Methoden. Die Anschlüsse sind direkt an der Laufzeit und der OP ist mit
QObject::connect
, die robust, um jene minderjährigen Unterschrift unterschieden.const T& T sind äquivalent, wenn es darum geht, Signale und slots, und es gibt keine Notwendigkeit, Typ const T&, immer (und es ist sogar noch langsamer zur Laufzeit durch die Normalisierung).
InformationsquelleAutor Julian