QT - 从mainwidow.cpp看不到现有的插槽

问题描述 投票:0回答:1

我需要做一些繁重的计算,所以我决定将它移到工作线程以避免GUI冻结。让我们假设我有两个文件:mainwindow.cppcalc.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中是不可见的,尽管它被设置为公共?

c++ qt signals-slots
1个回答
2
投票

沿着这些方向,也许是:

connect(newThread, &QThread::started,
        [=]() { sender->transfer(Va, Vb); });
© www.soinside.com 2019 - 2024. All rights reserved.