簡體   English   中英

QDialog exec() 並獲取結果值

[英]QDialog exec() and getting result value

我已經將QDialog子類化以實現類似於QMessageBox的功能(我需要它來允許定制)。 它有一條文本消息和確定、取消按鈕。 我正在使用exec()顯示對話框以使其阻塞。 現在,當用戶單擊“確定”/“取消”時,如何返回真/假值?

我嘗試將按鈕連接到setResult()然后在單擊時返回結果值,但是

  1. 單擊按鈕不會關閉對話框
  2. 返回值不正確。 以下是我編寫的代碼。 我認為我在 exec/result 部分是錯誤的——但我不確定如何修復它。
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() ,這將返回值並關閉(並刪除)對話框。

我已經發布了部分代碼。 如果您需要更多,請告訴我,我會發布完整版本。

幾點:

  1. 不要自己使用setResult() ,而是使用QDialog::accept()QDialog::r​​eject()
  2. 看來您沒有充分利用信號和插槽。 您需要創建對話(或另一個)的對象來收聽對話的信號。
  3. 在您的代碼中,您也沒有將信號連接到插槽。
  4. 隨着我修復onOKButtonClickedonCancelButtonClicked是不必要的。
  5. 通過我的修復,您不需要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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM