我有一个程序,它的类MainWindow
继承自QMainWindow
. 我想在一个新线程中运行一个特定的函数。
由于我不能继承,QThread
所以最好的解决方案是使用QtConcurrent
. 我将QtConcurrent
结果存储在 aQFuture
但如 QT 文档中所述,结果QtConcurrent
不能被QFuture::cancel
.
QThread
我看到了一些像我一样的问题,但答案是创建一个我不能继承的类。那么解决方案是什么?这是我的代码:
主窗口.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();
};
主窗口.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
函数完全执行。