Qt/C++如何断开QProgressDialog::cancel信号到其QProgress对话::cancel插槽的连



我有一个QProgressDialog,我想覆盖它的cancel()插槽以更改它的行为。

我不想关闭对话框,而是想做一些其他操作,然后在QThread完成后关闭对话框,然后再关闭对话框。

我试图断开canceled/cancel信号/插槽的连接,并用新的行为重新连接,但似乎没有太大变化。

只要我点击取消按钮,进度对话框就会首先关闭,然后我的lambda就会执行。

Qobject::disconnect(m_progressdialog, &QProgressDialog::canceled, m_progressdialog, &QProgressDialog::cancel);
Qobject::connect(m_progressdialog, &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();
});

有没有正确的方法?

我不知道你的全部代码,但根据文档,这个想法或多或少与你所说的相同:一个连接信号QProgressDialog::canceled()的插槽。

下面的代码只是一个示例,但它正在工作。在这种情况下,不是使用自己的Qt属性wasCanceled,而是使用布尔值来控制何时停止和取消QProgressDialog

对话框.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

对话框.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;
}

虽然这是2020年的问题,但我的代码遇到了同样的问题并解决了它。

我将代码从disconnect(this, &QProgressDialog::canceled, this, &QProgressDialog::cancel);更改为disconnect(this, &QProgressDialog::canceled, nullptr, nullptr);,断开成功。

希望它能帮助阅读本文的人,并有人能解释为什么第一个代码不起作用?

相关内容

  • 没有找到相关文章

最新更新