27

我已经进行了子类QDialog化以实现类似于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()预期返回值并关闭(并删除)对话框。

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

4

3 回答 3

32

几点:

  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
}
于 2012-09-18T08:21:25.493 回答
19

另一种解决方案:

    // 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 }
于 2014-04-27T11:36:55.420 回答
10

案例 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 中指定的更改后,它会得到解决。

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

于 2012-09-18T05:42:25.080 回答