可以使用Qt的QThread和信号槽机制来实现将耗时操作放在线程中,并在UI界面上显示结果。
首先定义一个自定义结构体,用于传递参数:
struct ThreadData {
QString input;
QString output;
};
然后创建一个继承自QObject的子类,用于执行耗时操作并发出信号:
class Worker : public QObject {
Q_OBJECT
public:
explicit Worker(QObject *parent = nullptr) : QObject(parent) {}
public slots:
void doWork(ThreadData data) {
// 执行耗时操作
QString result = calculate(data.input);
// 发送结果信号
emit workDone(data.output, result);
}
signals:
void workDone(QString output, QString result);
private:
QString calculate(QString input) {
// 这里写具体的计算函数
return "result";
}
};
在UI界面中,创建一个QThread对象和Worker对象,并将它们连接起来。在需要执行耗时操作的地方,通过调用Worker对象的doWork()方法来启动线程:
class MainWindow : public QMainWindow {
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr)
: QMainWindow(parent), ui(new Ui::MainWindow) {
ui->setupUi(this);
// 创建线程和worker对象
thread = new QThread();
worker = new Worker();
// 将worker对象移到新线程中执行
worker->moveToThread(thread);
// 连接信号槽
connect(worker, SIGNAL(workDone(QString,QString)),
this, SLOT(onWorkDone(QString,QString)));
connect(this, SIGNAL(startWork(ThreadData)),
worker, SLOT(doWork(ThreadData)));
// 启动线程
thread->start();
}
~MainWindow() {
delete ui;
thread->quit();
thread->wait();
}
private slots:
void on_pushButton_clicked() {
// 点击按钮时启动耗时操作
ThreadData data = {ui->lineEdit->text(), ""};
emit startWork(data);
}
void onWorkDone(QString output, QString result) {
// 显示结果
ui->label->setText(result);
}
private:
Ui::MainWindow *ui;
QThread *thread;
Worker *worker;
};
在这个例子中,当用户点击按钮时,UI界面会将输入参数传递给Worker对象,并发出startWork信号。Worker对象接收到信号后,在新线程中执行doWork方法,完成计算并发出workDone信号。UI界面接收到workDone信号后,将计算结果显示在Label控件上。
需要注意的是,在程序结束前需要手动停止线程和等待线程退出。可以在MainWindow类的析构函数中调用QThread的quit和wait方法来实现。