首先,我花了相当多的时间研究这个主题,并尝试了许多不同的配置无济于事。看来下面的内容接近于预期的内容,但我仍然缺少一些东西。
我从这个错误开始,同样怀疑程序是否按顺序执行,尽管我试图将其线程化......
QObject::moveToThread: Cannot move objects with a parent
此外,程序中任何地方(或线程尝试)的qDebug() << QThread::currentThreadId();
都返回相同的ID
然后我从此
更改了我的mainwindow
和Top_Calc
构造函数
SDS::SDS(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::SDS),
Top_Calc(this)
{
到这个
SDS::SDS(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::SDS)
{
现在,错误消失了,但是我的来自主窗口的信号似乎没有到达相应的线程,尽管.isrunning()返回true
MainWindow.cpp
SDS::SDS(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::SDS)
{
ui->setupUi(this);
qRegisterMetaType< Settings >();
connect(this, SIGNAL(SendTopHandles(Settings&)), &Top_Calc, SLOT(ReceiveHandles(Settings&)));
Top_Calc.moveToThread(&TopThread);
TopThread.start();
}
int SDS::on_StartScan_clicked() {
emit SendTopHandles(RunSet);
}
MainWindow.h
class SDS : public QMainWindow
{
Q_OBJECT
public:
explicit SDS(QWidget *parent = 0);
protected:
Settings RunSet;
private:
Ui::SDS *ui;
QThread TopThread;
TopCalc Top_Calc;
signals:
void SendTopHandles(Settings& RunSet);
}
CalcThreads.h
class TopCalc : public QObject
{
Q_OBJECT
public:
explicit TopCalc(QObject *parent = 0);
protected:
Settings* RunSet;
public slots:
void ReceiveHandles(Settings& RunSet);
}
CalcThreads.cpp
TopCalc::TopCalc(QObject *parent) :
QObject(parent)
{
}
void TopCalc::ReceiveHandles(Settings& S) {
RunSet = &S;
}
程序永远不会进入ReceiveHandles函数。它继续在以后的命令。如果我从构造函数和头文件中删除QObject父,我得到相同的结果。
我是否应该将线程变量放在main()函数中而不是ui构造函数中,因为有很多例子显示?
我错过了什么?