[英]Qt/C++ How can I disconnect a QProgressDialog::canceled signal to its QProgressDialog::cancel slot?
我有一個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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.