Qt信号槽:信号已发送但槽未被调用。

6
我在Visual Studio 2013中使用C++中的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);

在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
}

QObject::connect()的返回值是什么? - JKSH
返回值为true,因此必须已连接。 - user3838815
2个回答

10

我不知道这是否是你问题的核心,但是QVector已经可以在Qt元对象系统中传递。自定义类型需要进行注册。

qRegisterMetaType<T>("T");

标准的vector和标准库集合可能会豁免...我最近没有使用它们。

Qt的信号和槽的运行时连接在无法执行连接时会向应用程序输出发出警告。您还可以查看QObject::connect的返回值。

顺便说一下,与问题不直接相关,但我曾经遇到过使用QVector存储本地对象的问题。如果不正确地完成,对象将超出范围,并在访问时出现奇怪的错误。有时直到在调试模式下运行才会发生这种情况。如果在堆上初始化对象,则无需担心部分超出范围,但在调用集合的清除之前必须进行清理。

阅读有关QVector的内容并尝试使用它。

此外,在每个插槽的顶部放置以下内容:

qDebug() << Q_FUNC_INFO;

非常感谢!我刚刚想起来,我在移动代码时,曾经注释掉了我的main.cpp文件中的这一行,因为它会抛出错误。我刚刚取消了注释,现在它可以工作了!非常感谢!!! - user3838815
第一次弄清楚它是有点难的。祝你好运。 - phyatt

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

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


我的错误。我会修复上面的代码。我已经使声明和定义匹配,但它仍然无法工作。 - user3838815
1
你的信号采用了 const vector<>&,但是槽函数采用了 vector<>。虽然在纯C++中这两个签名在某种意义上是兼容的,但Qt信号/槽机制不会接受这种差异。MainWindow::updateStreamerUI 必须与 Streamer::processedImageStream 完全一致地采用其参数。 - Carlton
如果你在回答中澄清了这一点,我会给你点赞。我相信那是他问题的核心所在。 - Michael Petch
好的,我已经将所有参数更改为与updateStreamerUI参数匹配。但它仍然无法工作。 - user3838815
我更新了我的回答;如果你的头文件中有任何 using std::vector;,我建议你把它们删掉。这是不好的编程习惯,并会导致 Qt MOC 出现问题。 - Carlton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接