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();
;
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
。
【问题讨论】:
【参考方案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