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

Posted

技术标签:

【中文标题】QObject::connect: 没有这样的信号【英文标题】:QObject::connect: No such signal 【发布时间】: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

【问题讨论】:

【参考方案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部分,了解为什么需要这样做的完整说明。

【讨论】:

我试过了,但我一直收到undefined reference to vtable for MyThread 该消息与moc 相关。我认为***.com/questions/4774291/… 解决了这个问题。【参考方案2】:

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

只删除这部分:

void MyThread::valueChanged(int value)


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

【讨论】:

以上是关于QObject::connect: 没有这样的信号的主要内容,如果未能解决你的问题,请参考以下文章

QObject::connect: 没有这样的信号错误 C++

QObject::connect: 没有这样的信号progressbarV::keyReleaseEvent()

QObject::connect: 没有这样的信号运行时警告 - 找不到原因

如果在调用 QObject::connect() 之前发出信号,如何避免竞争?

QObject::connect: 需要括号,信号 QSerialPort::readyRead in ..\voltage_sensor\dialop.cpp:41

如何修复QObject::connect:没有这样的插槽..将发送者连接到同一类中的插槽时[重复]