#c #c 11 #qt5 #qprogressdialog
#c #c 11 #qt5 #qprogressdialog
Вопрос:
У меня есть a QProgressDialog
, и я хотел бы переопределить его cancel()
слот, чтобы изменить его поведение.
Вместо закрытия диалогового окна я хотел бы выполнить некоторые другие операции, а затем закрыть диалоговое окно после завершения QThread перед закрытием диалогового окна.
Я попытался отключить canceled/cancel
пары сигнал / слот и восстановить соединение с новым поведением, но, похоже, это не сильно изменилось.
Как только я нажимаю на кнопку отмены, сначала закрывается диалоговое окно выполнения, а затем мой лямбда-код все равно выполняется.
Qobject::disconnect(m_progressdialog, amp;QProgressDialog::canceled, m_progressdialog, amp;QProgressDialog::cancel);
Qobject::connect(m_progressdialog, amp;QProgressDialog::canceled, [](){
// continue displaying the dialog as an occupation bar
m_progressdialog->setValue(0);
// do some other things
// a lot of code
// ...
// only later close the dialog
m_progressdialog->close();
});
Есть ли способ сделать это правильно?
Ответ №1:
Я не знаю всего вашего кода, но, согласно документации, идея более или менее та же, что вы говорите: слот для подключения сигнала QProgressDialog::canceled()
.
Следующий код — всего лишь пример, но он работает. В этом случае вместо использования собственного свойства Qt wascancelled используется логическое значение для управления, когда останавливать и отменять QProgressDialog
.
dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
class QProgressDialog;
QT_BEGIN_NAMESPACE
namespace Ui { class Dialog; }
QT_END_NAMESPACE
class Dialog : public QDialog
{
Q_OBJECT
public:
Dialog(QWidget *parent = nullptr);
~Dialog();
private slots:
void on_pushButton_clicked();
void my_custom_cancel();
private:
Ui::Dialog *ui;
QProgressDialog *progress;
int numTasks = 100000;
bool canceled = false;
};
#endif // DIALOG_H
dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
#include <QProgressDialog>
#include <QThread>
#include <QDebug>
Dialog::Dialog(QWidget *parent)
: QDialog(parent)
, ui(new Ui::Dialog)
{
progress = new QProgressDialog("Task in progress...", "Cancel", 0, numTasks);
connect(progress, SIGNAL(canceled()), this, SLOT(my_custom_cancel()));
ui->setupUi(this);
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::on_pushButton_clicked()
{
progress->open();
for (int i = 0; i < numTasks; i ) {
progress->setValue(i);
QThread::usleep(100);
if (canceled)
break;
}
progress->setValue(numTasks);
}
void Dialog::my_custom_cancel()
{
qDebug() << "do something";
canceled = true;
}