[英]QDialog exec() and getting result value
我已經將QDialog
子類化以實現類似於QMessageBox
的功能(我需要它來允許定制)。 它有一條文本消息和確定、取消按鈕。 我正在使用exec()
顯示對話框以使其阻塞。 現在,當用戶單擊“確定”/“取消”時,如何返回真/假值?
我嘗試將按鈕連接到setResult()
然后在單擊時返回結果值,但是
class MyMessageBox : public QDialog {
Q_OBJECT
private slots:
void onOKButtonClicked() { this->setResult(QDialog::Accepted); }
void onCancelButtonClicked() { this->setResult(QDialog::Rejected); }
public:
MyMessageBox(QMessageBox::Icon icon, const QString& title,
const QString& text, bool showCancelButton = true,
QWidget* parent = 0);
virtual void resizeEvent(QResizeEvent* e);
QDialog::DialogCode showYourself()
{
this->setWindowModality(Qt::ApplicationModal);
this->exec();
return static_cast<QDialog::DialogCode>(this->result());
}
};
用戶將實例化 class 並調用showYourself()
,這將返回值並關閉(並刪除)對話框。
我已經發布了部分代碼。 如果您需要更多,請告訴我,我會發布完整版本。
幾點:
setResult()
,而是使用QDialog::accept()和QDialog::reject() 。onOKButtonClicked
和onCancelButtonClicked
是不必要的。showYourself()
。 只需調用exec
,事件信息就會流動。 你需要顯示的對話框(前添加以下代碼, this
假設是在對話框的方法):
QObject::connect(acceptButton, SIGNAL(clicked()), this, SLOT(accept()));
QObject::connect(rejectButton, SIGNAL(clicked()), this, SLOT(reject()));
在調用者對象中,你有
void someInitFunctionOrConstructor(){
QObject::connect(mydialog, SIGNAL(finished (int)), this, SLOT(dialogIsFinished(int)));
}
void dialogIsFinished(int){ //this is a slot
if(result == QDialog::Accepted){
//do something
return
}
//do another thing
}
另一種解決方案:
// set signal and slot for "Buttons"
connect(YesButton, SIGNAL(clicked()), dlg, SLOT(accept()));
connect(NoButton, SIGNAL(clicked()), dlg, SLOT(reject()));
// show modal window event loop and wait for button clicks
int dialogCode = dlg->exec();
// act on dialog return code
if(dialogCode == QDialog::Accepted) { // YesButton clicked }
if(dialogCode == QDialog::Rejected) { // NoButton clicked }
情況 1單擊按鈕不會關閉對話框。
為此,您必須關閉相應SLOTS
上的對話框,因此請使用
void onOKButtonClicked(){ this->setResult(QDialog::Accepted); this->close();}
void onCancelButtonClicked(){ this->setResult(QDialog::Rejected);this->close();}
注意:只有在標准 QMessageBox 中點擊了 Ok 按鈕或 Cancel 按鈕后,才會觸發 setResult() 函數並更改狀態。 反之,則效果不同。
情況2返回值不正確。
我認為只有在您的對話框關閉后,您才會在result()
函數中獲得result()
。 所以我想它會在您進行案例 1 中指定的更改后解決。
如果它仍然存在,請使用您自己的私有成員函數來解決它。
這個簡單的消息框檢查結果讓我摸不着頭腦,直到我碰巧看到 ManuelH 關於在 close() 之后調用 setResult() 的評論。 這一定是我很長一段時間以來遇到的最不直觀的事情之一。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.