Qt / C Как я могу отключить сигнал QProgressDialog::cancelled от его слота QProgressDialog::cancel?

#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;
}