我需要知道我做错了什么。
我尝试过研究它,但我无法找到与我的案例相关的任何内容。我是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
。
答案 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){
}
如果您的代码有效,那可能是运气,因为链接器会抛弃正确的实现。你不应该依赖它。