簡體   English   中英

Qt信號插槽:發送信號但不調用插槽

[英]Qt Signal Slot: Signal is sent but Slot is not called

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

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

run()函數中的Streamer.cpp

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
}

我不知道這是否是您問題的核心,但QVector已經准備好在Qt元對象系統中傳遞。 需要注冊自定義類型。

qRegisterMetaType<T>("T");

標准vector和標准庫集合可以免除......我最近沒有使用它們。

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

一個旁注,與問題沒有直接關系,但我遇到了QVector問題並在其中存儲了本地對象。 如果操作不正確,對象將超出范圍,訪問時會出現奇怪的錯誤。 有時,只有在調試模式下運行它才會發生。 如果在堆上初始化對象,則不必擔心它的一部分超出范圍,但是在對集合調用clear之前需要清理。

閱讀QVector並給它一個旋轉。

同樣位於每個廣告位的頂部,請輸入以下內容:

qDebug() << Q_FUNC_INFO;

信號/插槽簽名必須完全匹配。 我甚至在using Qt的指令(例如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中相應地更新定義。

還有一件事要在信號和槽定義AND聲明中完全限定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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM