gpt4 book ai didi

c++ - 使用 QTimer、QThread 和进度条

转载 作者:行者123 更新时间:2023-11-28 01:29:40 25 4
gpt4 key购买 nike

我想独立于 Ui 线程使用计算。计算方法——MainWindow Метод 的私有(private)槽。在计算过程中,在对象 OutputData — ProgressBar 窗口的字段中逐渐传输计算数据。执行计算的线程也是主窗口的一个字段。

主窗口构造函数,其中创建线程并将计算的开始连接到线程的开始:

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow) {
ui->setupUi(this);

calculation = new QThread(this);

settings.setToDefault();
outputData.setToDefault();
calculationDone = false;

connect(calculation, SIGNAL(started()), this, SLOT(calculate()));

ui->results_display->setText("Загрузите <b>параметры</b> и начинайте расчёты!");
}

按钮方法,启动线程和带进度条的模态窗口:

void MainWindow::on_calculate_button_clicked() {
ui->results_display->clear();
ui->results_display2->clear();

calculation->start();

///TODO QProgressDialog

ProgressDialog progressDialog(&outputData, this);
progressDialog.setModal(true);
progressDialog.exec();

if (progressDialog.result() == QDialog::Rejected) {
calculation->terminate();
QMessageBox::critical(this, "Результат", "Расчёт был остановлен!");
} else {
if (progressDialog.result() == QDialog::Accepted) {
calculation->quit();
QMessageBox::about(this, "Результат", "Готово!");
}
}
}

模态窗口构造函数设置ProgressBar的参数,创建定时器并设置定时器和更新方法之间的连接:

ProgressDialog::ProgressDialog(OutputData *outputData, QWidget *parent) :
QDialog(parent),
ui(new Ui::ProgressDialog) {
ui->setupUi(this);

data = outputData;

ui->quantity_label->setText("0");
ui->progressBar->setMinimum(0);
ui->progressBar->setMaximum(static_cast<int>(data->outputSettings.aircraftQuantity));

timer = new QTimer(this);
timer->setSingleShot(false);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(50);
}

进度条更新方法:

void ProgressDialog::update() {
unsigned long aircraftsDone = data->results.size() + data->unprocessedAircrafts.size();
ui->progressBar->setValue(static_cast<int>(aircraftsDone));
ui->aircraftQunatityDone_label->setText(QString::number(aircraftsDone));
ui->progressBar->repaint();

if (aircraftsDone == data->outputSettings.aircraftQuantity) {
accept();
}
}

当前计算运行良好,但没有绘制或更新进度信息。

最佳答案

这是因为你的calculate方法没有在新线程中调用。

要使用QThread 在新线程中运行任何方法,您必须将此方法是其公共(public)插槽的对象(此对象必须从QObject 类继承)移动到QThread 使用 QObject::moveToThread 实例,然后将您的方法与 QThread::started 信号连接。在您的情况下,您只需在 MainWindow 中的 calculate 插槽和 calculation 中的 QThread::started 信号之间设置连接,因此,当您调用 calculation->start() 时,您将在调用 calculation->start() 的同一线程中触发 calculate 方法>.

要解决这个问题,您应该为您的calculate 方法创建一个单独的类,然后将此类的对象移动到MainWindow 内的QThread构造函数。

我建议您查看 reference 中的示例

关于c++ - 使用 QTimer、QThread 和进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52150814/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com