Qt信号插槽:发送信号但不调用插槽

时间:2014-09-10 23:15:56

标签: c++ qt signals-slots

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

2 个答案:

答案 0 :(得分:8)

我不知道这是否是您问题的核心,但QVector已经准备好在Qt元对象系统中传递了。需要注册自定义类型。

qRegisterMetaType<T>("T");

标准vector和标准库集合可以免除......我最近没有使用它们。

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

附注,与问题没有直接关系,但我遇到了QVector的问题并在其中存储了本地对象。如果操作不正确,对象将超出范围,访问时会出现奇怪的错误。有时,只有在调试模式下运行它才会发生。如果你在堆上初始化你的对象,你不必担心它的一部分超出范围,但你需要在清除你的集合之前清理它。

阅读QVector,并给它一个旋转。

同样位于每个广告位的顶部,请输入以下内容:

qDebug() << Q_FUNC_INFO;

答案 1 :(得分: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中相应地更新定义。

要尝试的另一件事是在信号和槽定义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);