2014-09-10 185 views
4

我在C++中使用Visual Studio 2013中的Qt。我正嘗試將信號連接到插槽。問題是信號被髮送,但插槽功能從未被調用,我不知道發生了什麼。此代碼在早期工作,但在將代碼從32位的Visual Studio 2012遷移到64位的Visual Studio 2013並做了一些更改後,它不再起作用。它會打印調試語句:發送前,發送圖像和連接之前,但不會打印出接收到的圖像。有人可以幫忙嗎?Qt信號插槽:信號已發送,但未插入插槽

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在run()函數

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 
} 
+0

什麼是QObject的返回值::連接()? – JKSH 2014-09-10 23:23:38

+0

返回值爲true,所以必須連接 – user3838815 2014-09-10 23:26:28

回答

8

我不知道這是不是你的問題或沒有的心臟,但QVector已經準備好通過圍繞Qt的元對象系統。自定義類型需要註冊。

qRegisterMetaType<T>("T"); 

標準vector,和標準的圖書館館藏可以減免......我最近沒有使用它們。

Qt的信號和插槽的運行時連接在無法執行連接時會嚮應用程序輸出發出警告。您還可以查看QObject::connect的返回值。

一個附註,與問題沒有直接關係,但我遇到了問題QVector並在其中存儲本地對象。如果執行不當,對象將超出範圍,訪問它時會出現奇怪的錯誤。有時只有在調試模式下運行它纔會發生。如果你在堆上初始化你的對象,你不必擔心它的一部分超出了範圍,但是在清除你的集合之前你需要清理它。

請閱讀QVector,並給它一個旋轉。

此外,在每個插槽的上方,把下面的:

qDebug() << Q_FUNC_INFO; 
+0

非常感謝!我只記得我從main.cpp文件中評論了這一行,因爲它在我移動代碼時發生了錯誤。我只是取消了它的評論,現在它的工作原理!非常感謝!!! – user3838815 2014-09-10 23:58:38

+0

這是第一次找出鼻屎。祝你好運。 – phyatt 2014-09-11 00:06:42

0

信號/插槽簽名必須完全匹配。我甚至在使用Qt的using指令(例如using std::string;)中遇到問題,因爲它不能將string識別爲std::string

它看起來像MainWindow::updateStreamerUI聲明不符合.cpp文件中的定義。

例如,MainWindow::updateStreamerUI聲明更改爲這樣:

void updateStreamerUI(const vector<QImage> &imgs, const QImage &imgIntel, const QImage &imgIntelDepth, const QImage &imgIntelIR)

然後在MainWindow.cpp相應地更新定義。

要做的另一件事是在信號和時隙定義和聲明中完全限定std :: vector,

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

+0

我的錯誤。我將修復上面的代碼。我做了聲明和定義匹配,但它仍然不起作用。 – user3838815 2014-09-10 23:33:44

+1

你的信號採用了一個'const vector <>&',但是該槽需要一個'vector <>'。儘管這兩個簽名在純C++中是相容的,但Qt信號/插槽機制不會像差別那樣。 'MainWindow :: updateStreamerUI'必須像'Streamer :: processedImageStream'一樣接受它們的參數。 – Carlton 2014-09-10 23:40:50

+0

如果您在答案中作出澄清,我會爲您的答案投票。我相信這是他問題的核心。 – 2014-09-10 23:43:38