【问题标题】:QObject::connect: No such signalQObject::connect: 没有这样的信号
【发布时间】:2015-08-03 21:15:39
【问题描述】:

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

我尝试对此进行研究,但我真的找不到任何与我的案例相关的内容。我是 QT 新手,调试信号和插槽对我来说有点技术性。

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

这是我的基本代码 sn-ps:

thread.h

class MyThread : public QThread
{

public:
    MyThread(QWidget * parent = 0);


signals:
    void valueChanged(int value);

protected:
    void run();
};

ma​​inwindow.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

【问题讨论】:

    标签: c++ multithreading qt


    【解决方案1】:

    我认为错误消息是由于您的 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部分,了解为什么需要这样做的完整说明。

    【讨论】:

    【解决方案2】:

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

    只删除这部分:

    void MyThread::valueChanged(int value){
    
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多