QObject::connect:无此信号

QObject::connect: No such signal

本文关键字:信号 connect QObject      更新时间:2023-10-16

我需要知道我做错了什么。

我试着研究了一下,但我找不到任何与我的案子有关的东西。我是QT的新手,调试信号和插槽对我来说有点技术。

我想做的很简单:创建一个线程,它将不断地向我的QProgressBar小部件发送信号。

下面是我的基本代码片段:

thread.h

class MyThread : public QThread
{
public:
    MyThread(QWidget * parent = 0);

signals:
    void valueChanged(int value);
protected:
    void run();
};

mainwindow.cpp

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    MyThread * test = new MyThread(this);
    connect(test,SIGNAL(valueChanged(int)),ui->progressBar,SLOT(setValue(int)));
    test->start();
}

thread.cpp

MyThread::MyThread(QWidget * parent)
{
}


void MyThread::run(){
emit valueChanged(10);  //for simplicity
}

void MyThread::valueChanged(int value){
}

我的UI上只有一个progressBar,我的main与默认值相同。

无论如何,在运行代码时。我一直从我的线程类得到这个no such signal。我能知道我做错了什么吗?我也想用我自己的话澄清一下我对signals and slots的理解是否正确:这意味着每次调用signal时都会触发slot

我认为错误消息是由于MyThread声明顶部缺少Q_OBJECT宏。http://doc.qt.io/qt-5/signalsandslots.html上的文档解释了这对于任何想要声明信号和槽的类都是必要的。

将类定义更改为:

class MyThread : public QThread
{
    Q_OBJECT
    public:
        MyThread(QWidget * parent = 0);
    signals:
        void valueChanged(int value);
    protected:
        void run();
};

请查看链接的文档,特别是 a Small Example一节,以获得所需的完整解释。

不能在.cpp文件中实现信号。MOC会做到这一点,而且必须只有一个实现。

删掉这部分:

void MyThread::valueChanged(int value){
}

如果你的代码可以工作,那可能是运气,因为链接器丢弃了正确的实现。