如何在Qt 5中使用QMessageBox?

3

我正在使用Qt 5.2.1制作程序。 我需要的是,当用户单击按钮时,警告框出现,如果用户单击“确定”则程序继续运行,如果他单击“取消”则不会发生任何事情。

我该如何做? 我对Qt完全是新手。


2
请参考文档,有许多示例和(视频)教程可供您入门(http://qt-project.org/doc/qt-5.0/qtdoc/qtexamplesandtutorials.html)。 - c_k
1
请参阅QMessageBox - thuga
实际上,Qt有很多简单的示例。学习它们! - dgrat
@thuga 我读了那个,并且找到了qDebug和qWarning,但是它并没有回答我的问题。我想要检查用户是否点击了确定按钮。 - user121273
1
如果您认为在QMessageBox文档中遇到了qDebugqWarning,那么您可能需要重新阅读一下该文档。 - Kuba hasn't forgotten Monica
1个回答

3
这是一种使用sscce的方式。我努力使其尽可能正确和简洁。我注意以下几点:
  1. 阻塞方法会重新进入事件循环,这是错误的根源,不应使用QMessageBox::exec()

  2. 使用标准按钮。

  3. 为了符合平台间的人机界面指南,提供文本和信息性文本。

  4. 消息框的模态性根据实际需求设置。它是窗口模态的,防止与底层窗口交互,但可以与应用程序其他部分交互。

  5. 子控件是常规成员,不是直接在堆上分配的。这样做可以更容易地进行内存管理,并利用RAII。在内部,它们将在堆上分配PIMPLs

  6. 构造成员时使用默认成员初始化程序

  7. 向布局添加的控件不传递父对象。这样做是多余的。

  8. 槽具有描述性名称,指示其作用于哪个控件和哪个信号。与指定控件对象名称一起使用,这使我们可以利用connectSlotsByName机制。它还简化了调试,因为调试助手在调试Qt应用程序时让我们看到对象名称。

P.S. QDrag,我正在盯着你看。你知道,那种眼神

// main.cpp
#include <QtGlobal>
#if QT_VERSION < QT_VERSION_CHECK(5,0,0)
#include <QtGui>
#else
#include <QtWidgets>
#endif

class MyUi : public QWidget {
   Q_OBJECT
   QBoxLayout m_layout{QBoxLayout::TopToBottom, this};
   QLabel m_label;
   QPushButton m_button{"Change Message"};
   QMessageBox m_warning{QMessageBox::Warning, "Message Change",
                         "The message will change.",
                         QMessageBox::Yes | QMessageBox::No,
                         this},
   Q_SLOT void on_button_clicked() {
      m_warning.show();
   }
   Q_SLOT void on_warning_finished(int rc) {
      // The `finished()` signal is emitted with a
      // QDialogButtonBox::StandardButton value - the same that would
      // be retuned by QMessageBox::exec().
      // A QMessageBox does *not*  accept the dialog,
      // so we can't simply use the `accepted` signal.
      if (rc != QDialogButtonBox::Yes) return;
      m_label.setText(m_label.text() + "*v*");
   }
public:
   MyUi(QWidget * parent = {}) : QWidget(parent) {
      m_button.setObjectName("button");
      m_warning.setObjectName("warning");
      m_warning.setWindowModality(Qt::WindowModal);
      m_warning.setInformativeText(
               "Are you sure you want the message to change?");
      m_layout.addWidget(&m_label);
      m_layout.addWidget(&m_button);
      QMetaObject::connectSlotsByName(this);
   }
};

int main(int argc, char *argv[])
{
   QApplication a(argc, argv);
   MyUi ui;
   ui.show();
   return a.exec();
}

#include "main.moc"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接