0

SLOT私のメインスレッドで、ボタンによってトリガーされた this を考えてみてQTreeWidgetItemくださいQTreeWidget。呼び出しを使用しQtConcurrent::map()て長いタスクを実行します。がにwatcher接続され、QProgressDialog進行状況が表示されます。

void Main::on_actionButton_triggered() {
    qRegisterMetaType<QVector<int> >("QVector<int>");

    //Setting up a progress dialog
    QProgressDialog progressDialog;

    //Holds the list
    QList<QTreeWidgetItem*> list;

    //Setup watcher
    QFutureWatcher<void> watcher;

    //Setting up connections
    //Progress dialog
    connect(&watcher, SIGNAL(progressValueChanged(int)), &progressDialog, SLOT(setValue(int)));
    connect(&watcher, SIGNAL(progressRangeChanged(int, int)), &progressDialog, SLOT(setRange(int,int)));
    connect(&watcher, SIGNAL(progressValueChanged(int)), ui->progressBar, SLOT(setValue(int)));
    connect(&watcher, SIGNAL(progressRangeChanged(int, int)), ui->progressBar, SLOT(setRange(int,int)));
    connect(&watcher, SIGNAL(finished()), &progressDialog, SLOT(reset()));
    connect(&progressDialog, SIGNAL(canceled()), &watcher, SLOT(cancel()));

    connect(&watcher, SIGNAL(started()), this, SLOT(processStarted()));
    connect(&watcher, SIGNAL(finished()), this, SLOT(processFinished()));

    //Gets the list filled
    for (int i = 0; i < ui->listTreeWidget->topLevelItemCount(); i++) {
        list.append(ui->listTreeWidget->topLevelItem(i));
    }

    //And start
    watcher.setFuture(QtConcurrent::map(list, processRoutine));

    //Show the dialog
    progressDialog.exec();

}

extern void processRoutine(QTreeWidgetItem* item) {
    qDebug() << item->text(4);
}

また、UI (以前のすべてのウィジェットを保持する) にQProgressBar、同じ SIGNALS/SLOTS を持つ を追加しました。以前のようにコードを維持すると、期待どおりに動作します。進行状況ダイアログが表示され、進行状況バーがダイアログとまったく同じように更新されます。代わりに、コメントすると

//progressDialog.exec(); 

または、何らかの方法でダイアログを非表示にすると、プロセスがクラッシュします (常にではなく、うまくいく場合もあります)。それを見るqDebug() << item->text(4);とクラッシュし、出力にはランダムに混合されたテキストが表示されます (それらはファイル名であるはずです)。QProgressDialogまた、計算がクラッシュしなくても、 が表示されていない場合、進行状況バーは更新されません。

注:以前に別の関数で同様の問題が発生し、設定することで解決しました

QThreadPool::globalInstance()->setMaxThreadCount(1);

Windows のみで、OSX は問題ありませんでした。

QProgressDialogでは、すべてを正しくする の背後にあるトリックは何ですか? QProgressBarの代わりにを使用する方法はありQProgressDialogますか?

ノート

これは、プロセスが問題なく完了したときの出力です。

"C:/Users/Utente/Pictures/Originals/unsplash_52cee67a5c618_1.jpg"
"C:/Users/Utente/Pictures/Originals/photo-1428278953961-a8bc45e05f72.jpg"
"C:/Users/Utente/Pictures/Originals/photo-1429152937938-07b5f2828cdd.jpg"
"C:/Users/Utente/Pictures/Originals/photo-1429277158984-614d155e0017.jpg"
"C:/Users/Utente/Pictures/Originals/photo-1430598825529-927d770c194f.jpg"
"C:/Users/Utente/Pictures/Originals/photo-1433838552652-f9a46b332c40.jpg"
4

1 に答える 1