Qt-Signal-Slot: Signal gesendet wird, aber Slot ist nicht genannt
Bin ich mit Qt in Visual Studio 2013 C++. Ich versuche, schließen Sie ein signal an einen slot. Das problem ist, dass das signal gesendet wird, aber die slot-Funktion wird nie aufgerufen und ich weiß nicht, was passiert ist. Dieser code war die Arbeit früher, aber nachdem ich die Migration der code von Visual Studio 2012 in 32-bit-Visual Studio 2013 in 64-bit und einige änderungen vorgenommen, es nicht mehr funktioniert. Es druckt das debug-Anweisungen: bevor Sie senden, Bild gesendet und angeschlossen aber es funktioniert nicht, drucken Sie empfangene Bild. Kann mir bitte jemand helfen?
Streamer.h
signals:
//Signal to output frame to be displayed
void processedImageStream(const vector<QImage> &imgs, const QImage &image2, const QImage &image3, const QImage &image4);
Streamer.cpp in der run () - Funktion
qDebug() << "before sending";
emit processedImageStream(imgs,imgIntel, imgIntelDepth, imgIntelIR);
qDebug() << "images sent!";
MainWindow.h
private slots:
//Display video frame in streamer UI
void updateStreamerUI(const vector<QImage> &imgs, const QImage &imgIntel, const QImage &imgIntelDepth, const QImage &imgIntelIR);
private:
Streamer* myStreamer;
MainWindow.cpp
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
//Streamer initialization
myStreamer = new Streamer();
QObject::connect(myStreamer, SIGNAL(processedImageStream(vector<QImage>, QImage, QImage, QImage)), this, SLOT(updateStreamerUI(vector<QImage>, QImage, QImage, QImage)));
qDebug() << "connected";
ui.setupUi(this);
}
//slot for when new images are sent from the Streamer class
void MainWindow::updateStreamerUI(const vector<QImage> &imgs, const QImage &imgIntel, const QImage &imgIntelDepth, const QImage &imgIntelIR) {
qDebug() << "images received!";
//rest of the code
}
- Was ist der return-Wert von QObject::connect()?
- Der Rückgabewert ist wahr, also muss es verbunden sein
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich weiß nicht, ob dies ist der Kern des Problems ist oder nicht, aber
QVector
schon bereit ist für die übergabe um in die Qt Meta-Object system. Benutzerdefinierte Typen müssen registriert werden.Standard
vector
und standard-Bibliothek Sammlungen kann befreit werden... ich habe Sie nicht genutzt in letzter Zeit.Qt-runtime die Verbindung der Signale und slots druckt eine Warnung an die Anwendung ausgegeben, wenn es nicht durchführen kann die Verbindung. Sie können auch den Rückgabewert von
QObject::connect
.Einer seitlichen Anmerkung, die nicht direkt mit der Frage, aber ich habe Probleme mit
QVector
und Speicherung lokaler Objekte. Wenn Sie unsachgemäß durchgeführt wird, die Objekte außerhalb des Bereichs, und Sie erhalten seltsame Fehler beim Zugriff auf es. Manchmal wird es nicht passieren, bis Sie es ausführen im debug-Modus. Wenn Sie initialisieren Sie Ihre Objekte auf dem heap, Sie müssen nicht sorgen zu machen über die Teile, es geht out of scope, aber Sie müssen zu bereinigen, bevor Sie klar auf Ihre Sammlung.Lesen, auf
QVector
und geben ihm einen spin.Auch an der Spitze der jede Ihrer slots, die folgende Punkte:
Signal/Slot-Signaturen müssen GENAU übereinstimmen. Ich habe sogar schon Probleme mit
using
Richtlinien (z.B.using std::string;
) mit Qt ist, dass es nicht erkennt, einstring
alsstd::string
.Es sieht auch wie die Erklärung für
MainWindow::updateStreamerUI
entspricht nicht der definition in der .cpp-Datei.Zum Beispiel, ändern Sie die Deklaration von
MainWindow::updateStreamerUI
dieser:void updateStreamerUI(const vector<QImage> &imgs, const QImage &imgIntel, const QImage &imgIntelDepth, const QImage &imgIntelIR)
Dann aktualisieren Sie die definition entsprechend in MainWindow.cpp.
Eine weitere Sache, um zu versuchen, um vollständig zu qualifizieren, std::vector sowohl die signal-UND slot-Definitionen UND Erklärungen, z.B.
void processedImageStream(const std::vector<QImage> &imgs, const QImage &image2, const QImage &image3, const QImage &image4);
void updateStreamerUI(const std::vector<QImage> &imgs, const QImage &imgIntel, const QImage &imgIntelDepth, const QImage &imgIntelIR);
const vector<>&
, aber der slot nimmt einevector<>
. Obwohl diese beiden Signaturen sind kompatibel in gewissem Sinne in pure c++, der Qt signal/slot-Mechanismus wird nicht, wie der Unterschied ist.MainWindow::updateStreamerUI
muss seine Argumente genau so, wieStreamer::processedImageStream
nimmt Sie.using std::vector;
in Ihrem Header, ich würde Sie loswerden. Es ist eine schlechte Gewohnheit und führt zu Problemen mit der Qt MOC.