Câu trả lời:
Bạn sẽ sử dụng QMessageBox::questioncho điều đó.
Ví dụ trong vùng của tiện ích con giả định:
#include <QApplication>
#include <QMessageBox>
#include <QDebug>
// ...
void MyWidget::someSlot() {
QMessageBox::StandardButton reply;
reply = QMessageBox::question(this, "Test", "Quit?",
QMessageBox::Yes|QMessageBox::No);
if (reply == QMessageBox::Yes) {
qDebug() << "Yes was clicked";
QApplication::quit();
} else {
qDebug() << "Yes was *not* clicked";
}
}
Nên hoạt động trên Qt 4 và 5, yêu cầu QT += widgetstrên Qt 5 và CONFIG += consoletrên Win32 để xem qDebug()đầu ra.
Xem StandardButtonenum để biết danh sách các nút bạn có thể sử dụng; hàm trả về nút đã được nhấp. Bạn có thể đặt một nút mặc định với một đối số bổ sung (Qt " tự động chọn một mặc định phù hợp " nếu bạn không hoặc chỉ định QMessageBox::NoButton).
Bạn có thể sử dụng đối tượng QMessage để tạo Hộp thư sau đó thêm các nút:
QMessageBox msgBox;
msgBox.setWindowTitle("title");
msgBox.setText("Question");
msgBox.setStandardButtons(QMessageBox::Yes);
msgBox.addButton(QMessageBox::No);
msgBox.setDefaultButton(QMessageBox::No);
if(msgBox.exec() == QMessageBox::Yes){
// do something
}else {
// do something else
}
setIconphương thức của QMessageBoxđối tượng. với một nếu những enums như paramters: QMessageBox::NoIcon QMessageBox::Question QMessageBox::Information doc.qt.io/qt-4.8/qmessagebox.html#icon-prop
Tôi đang bỏ lỡ cuộc gọi dịch trtrong câu trả lời.
Một trong những giải pháp đơn giản nhất, cho phép quốc tế hóa sau này:
if (QMessageBox::Yes == QMessageBox::question(this,
tr("title"),
tr("Message/Question")))
{
// do stuff
}
Nói chung là một Qtthói quen tốt để đặt các Chuỗi cấp mã trong một tr("Your String")cuộc gọi.
( QMessageboxnhư trên hoạt động trong bất kỳ QWidgetphương pháp nào )
BIÊN TẬP:
bạn có thể sử dụng QMesssageBoxbên ngoài QWidgetngữ cảnh, hãy xem câu trả lời của @ TobySpeight.
Nếu bạn thậm chí đang ở bên ngoài QObjectngữ cảnh, hãy thay thế trbằng qApp->translate("context", "String")- bạn sẽ cần#include <QApplication>
QMessageBox bao gồm các phương thức tĩnh để hỏi nhanh những câu hỏi như vậy:
#include <QApplication>
#include <QMessageBox>
int main(int argc, char **argv)
{
QApplication app{argc, argv};
while (QMessageBox::question(nullptr,
qApp->translate("my_app", "Test"),
qApp->translate("my_app", "Are you sure you want to quit?"),
QMessageBox::Yes|QMessageBox::No)
!= QMessageBox::Yes)
// ask again
;
}
Nếu nhu cầu của bạn phức tạp hơn các phương thức tĩnh được cung cấp, bạn nên xây dựng một QMessageBoxđối tượng mới và gọi exec()phương thức của nó để hiển thị nó trong vòng lặp sự kiện của chính nó và lấy mã nhận dạng nút được nhấn. Ví dụ: chúng tôi có thể muốn đặt "Không" là câu trả lời mặc định:
#include <QApplication>
#include <QMessageBox>
int main(int argc, char **argv)
{
QApplication app{argc, argv};
auto question = new QMessageBox(QMessageBox::Question,
qApp->translate("my_app", "Test"),
qApp->translate("my_app", "Are you sure you want to quit?"),
QMessageBox::Yes|QMessageBox::No,
nullptr);
question->setDefaultButton(QMessageBox::No);
while (question->exec() != QMessageBox::Yes)
// ask again
;
}
QApplicationtôi muốn đề nghị sử dụng qApp->translate("context", "String"), thay thế trcho bên ngoài sử dụng một QObjectlớp
Nếu bạn muốn tạo nó trong python, bạn cần kiểm tra mã này trong bàn làm việc của mình. cũng viết như thế này. chúng tôi đã tạo một hộp bật lên với python.
msgBox = QMessageBox()
msgBox.setText("The document has been modified.")
msgBox.setInformativeText("Do you want to save your changes?")
msgBox.setStandardButtons(QMessageBox.Save | QMessageBox.Discard | QMessageBox.Cancel)
msgBox.setDefaultButton(QMessageBox.Save)
ret = msgBox.exec_()