,所以我正在qt 5.2.1中制作一个程序。我需要的是,当用户单击按钮时,会出现警告,如果用户单击"确定",则继续程序,如果他单击"取消",则什么都不会发生。
我该怎么做?我是QT的全新者。
这是做到这一点的一种SSCCE方法。我一直在努力使其尽可能正确和最小。我关注以下内容:
-
阻止事件循环重新进入的方法必然是错误的来源,因此不应使用。因此,我们不使用
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"