【问题标题】:QDialog exec() and getting result valueQDialog exec() 并获取结果值
【发布时间】:2012-09-10 08:25:18
【问题描述】:

我对@9​​87654321@ 进行了子类化,以实现类似于QMessageBox 的功能(我需要它来允许自定义)。它有一条短信和确定、取消按钮。我正在使用exec() 显示对话框以使其阻塞。现在,当用户点击 OK/Cancel 时,如何返回 true/false 值?

我尝试将按钮连接到setResult(),然后在单击时返回结果值,但是

  1. 单击按钮不会关闭对话框
  2. 返回值不正确。 以下是我编写的代码。我认为我在执行/结果部分错了 - 但我不确定如何解决它。
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());
    }
};

用户将实例化该类并调用showYourself(),它预计将返回值并关闭(并删除)对话框。

我已经发布了部分代码。如果您需要更多信息,请告诉我,我会发布完整版本。

【问题讨论】:

    标签: c++ qt qdialog


    【解决方案1】:

    案例1单击按钮不会关闭对话框。

    为此,您必须关闭相应SLOTS 上的对话框,因此请使用

    void onOKButtonClicked(){ this->setResult(QDialog::Accepted); this->close();}
    void onCancelButtonClicked(){ this->setResult(QDialog::Rejected);this->close();}  
    

    注意:只有在标准 QMessageBox 中单击了 Ok 按钮或 Cancel 按钮后,才会触发 setResult() 函数并更改状态。反之亦然。

    情况2返回值不正确。

    我认为只有在您的对话框关闭后,您才能在result() 函数中获得结果。所以我想它会在你做出案例1中指定的更改后解决。

    如果仍然存在,请使用您自己的私有成员函数来解决它。

    【讨论】:

    • 设置 this->setResult(QDialog::Accepted) 后调用 this->close();将导致结果最终为 0 而不是 1。所以在 close() 之后调用 setResult()
    【解决方案2】:

    几点:

    1. 与其自己使用setResult(),不如使用QDialog::accept()QDialog::reject()
    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
    }
    

    【讨论】:

    • 谢谢!这很有启发性。如果我这样做,我需要显式删除该对象,还是在内部处理它?
    • 如果对象有父对象,则在删除父对象时将其删除。您可以使用QObject::deleteLater() 安排删除。当您确定不再使用某个对象时(没有与此对象相关的事件),您可以使用旧的删除。
    【解决方案3】:

    另一种解决方案:

        // 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 }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多