2

我有一个程序,它的类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_pushButtongeneratedGraph在一个新线程中被调用,但是当我点击时stop_pushButton不会future停止并且generatedGraph函数完全执行。

4

0 回答 0