QObject :: connect:没有这样的信号

时间:2015-08-03 21:15:40

标签: c++ multithreading qt

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

我尝试过研究它,但我无法找到与我的案例相关的任何内容。我是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){

}

我的界面上只有一个progressBar,我的main与默认设置相同。

无论如何,在运行代码时。我继续从我的线程类中获取no such signal。我可以知道我做错了什么吗?我还想澄清一下我的理解是否正确signals and slots用我自己的话来说:这意味着每次调用slot时都会触发signal

2 个答案:

答案 0 :(得分:7)

我认为错误消息是由于Q_OBJECT声明顶部缺少MyThread宏。 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();
};

请查看链接的文档,特别是小型示例部分,以获取完整解释原因。

答案 1 :(得分:3)

您不得在.cpp文件中实现信号。 MOC将这样做,而且必须只有一个实现。

只需删除此部分:

void MyThread::valueChanged(int value){

}

如果您的代码有效,那可能是运气,因为链接器会抛弃正确的实现。你不应该依赖它。