我需要做一些繁重的计算,所以我决定将它移到工作线程以避免GUI冻结。让我们假设我有两个文件:mainwindow.cpp
和calc.cpp
。两者都有遗忘的头文件。从GUI收集一些用户输入,当用户按下按钮时,计算开始。这里有一个片段:
mainwindow.cpp
#include "calc.h"
Va = ui->lineEdit_Va->text().toDouble();
Vb = ui->lineEdit_Vb->text().toDouble();
//Progress bar definition
sender = new calc();
connect(sender, SIGNAL( inprogress(int) ), ui->progressBar, SLOT( setValue(int) ) );
//Calculation begins here
QThread* newThread = new QThread();
sender->moveToThread(newThread);
connect( newThread, SIGNAL(started()), sender, SLOT(transfer(Va, Vb)));
newThread->start();
calc.h
class calc : public QObject
{
Q_OBJECT
public:
calc(QObject *parent=0);
public slots:
void transfer(double Va, double Vb);
signals:
void inprogress(int progr);
};
虽然进度条连接完全正常,但connect( newThread, SIGNAL(started()), sender, SLOT(transfer(Va, Vb)));
似乎对qt创建者不可见。它以错误结束:
QObject :: connect:在../my-directory/mainwindow.cpp中没有这样的插槽calc :: transfer(Va,Vb)
我认为它可能与旧的moc文件相关,但是我尝试清理构建,更改工作目录,甚至手动删除moc文件并且没有任何改变。所以问题是,为什么这个插槽在mainwindow.cpp中是不可见的,尽管它被设置为公共?
沿着这些方向,也许是:
connect(newThread, &QThread::started,
[=]() { sender->transfer(Va, Vb); });