我正在使用Qt 5.2.1制作程序。 我需要的是,当用户单击按钮时,警告框出现,如果用户单击“确定”则程序继续运行,如果他单击“取消”则不会发生任何事情。
我该如何做? 我对Qt完全是新手。
阻塞方法会重新进入事件循环,这是错误的根源,不应使用QMessageBox::exec()
。
使用标准按钮。
为了符合平台间的人机界面指南,提供文本和信息性文本。
消息框的模态性根据实际需求设置。它是窗口模态的,防止与底层窗口交互,但可以与应用程序其他部分交互。
子控件是常规成员,不是直接在堆上分配的。这样做可以更容易地进行内存管理,并利用RAII。在内部,它们将在堆上分配PIMPLs。
构造成员时使用默认成员初始化程序。
向布局添加的控件不传递父对象。这样做是多余的。
槽具有描述性名称,指示其作用于哪个控件和哪个信号。与指定控件对象名称一起使用,这使我们可以利用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"
QMessageBox
。 - thugaQMessageBox
文档中遇到了qDebug
和qWarning
,那么您可能需要重新阅读一下该文档。 - Kuba hasn't forgotten Monica