【发布时间】:2018-03-04 13:07:51
【问题描述】:
我需要做一些繁重的计算,所以我决定将它移到工作线程以避免 GUI 冻结。假设我有两个文件:mainwindow.cpp 和 calc.cpp。两者都有头文件。从 GUI 收集一些用户输入,当用户按下按钮时,计算开始。这里有一个sn-p:
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 文件,但没有任何改变。那么问题来了,为什么这个 slot 在 mainwindow.cpp 中是不可见的,尽管它被设置为 public?
【问题讨论】:
-
只是一般建议。远离基于字符串的信号/插槽连接(使用
SIGNAL()和SLOT()宏的连接),而更喜欢使用编译时检查的指针到成员函数语法的新样式连接。它们更安全、更快捷。 -
您需要指定 type 名称,而不是
SLOT规范中的形式参数名称。所以SLOT(transfer(double, double))。请注意,如果您遵循@JesperJuhl 的建议,这几乎肯定会被编译器标记。 -
也许我错过了插槽概念中的某些内容,但如果我这样做了:
connect( newThread, &NewThread::started, sender, &Sender::transfer);我将如何指定要与插槽一起传输的参数? -
Va和Vb在哪里? calc 可以访问它们吗?你不能像现在这样传递参数。 -
@drescherjm - 编辑了第一篇文章,包括 Va 和 Vb 定义。
标签: c++ qt signals-slots