我有一个程序,其中包含继承自MainWindow
的类QMainWindow
。
我想在新线程中运行一个特定的函数。
由于我无法继承QThread
,因此最佳解决方案是使用QtConcurrent
。
我将QtConcurrent
结果存储在QFuture
中,但正如QT文档中所述,QtConcurrent
无法取消QFuture::cancel
的结果。
我看到一些类似我的问题,但答案是创建一个继承自QThread
但我不能继承的类。
那么解决方案是什么?
这是我的代码:
mainwindow.h:
using namespace std;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
...
private:
Ui::MainWindow *ui;
...
QFuture<void> future;
QFutureWatcher< void > futureWatcher;
QPushButton *stop_pushButton_=new QPushButton;
private slots:
...
void on_graph_pushButton_clicked();
void generateGraph();
void stopPushButtonClicked();
};
mainwindow.cpp:
void MainWindow::stopPushButtonClicked()
{
futureWatcher.setFuture(future);
futureWatcher.cancel();
futureWatcher.waitForFinished();
}
...
void MainWindow::on_graph_pushButton_clicked()
{
loadingOn();
future = QtConcurrent::run(this,&MainWindow::generateGraph);
}
void MainWindow::generateGraph()
{
InsertLogs::getInstance()->printStatus(USER_GENERATE_GRAPH);
GenGraph* gr=new GenGraph;
connect(this,&MainWindow::loadingOffSignal,this,&MainWindow::loadingOff);
graphType_=gr->generateGraph(persons_comboBox_->currentText(),
ui->graphResource1_comboBox->currentText(),
ui->graphResource2_comboBox->currentText(),
ui->graphType_comboBox->currentText());
InsertLogs::getInstance()->printSuccess(SYSTEM_GENERATE_GRAPH);
emit loadingOffSignal();
}
当我点击graph_pushButton
时,generatedGraph
会在新主题中被调用,但当我点击stop_pushButton
时,future
并未停止generatedGraph
函数完全执行。