2014-09-10 183 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