Câu trả lời:
Bạn sẽ sử dụng QMessageBox::question
cho đ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 += widgets
trên Qt 5 và CONFIG += console
trên Win32 để xem qDebug()
đầu ra.
Xem StandardButton
enum để 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
}
setIcon
phươ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 tr
trong 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 Qt
thói quen tốt để đặt các Chuỗi cấp mã trong một tr("Your String")
cuộc gọi.
( QMessagebox
như trên hoạt động trong bất kỳ QWidget
phương pháp nào )
BIÊN TẬP:
bạn có thể sử dụng QMesssageBox
bên ngoài QWidget
ngữ 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 QObject
ngữ cảnh, hãy thay thế tr
bằ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
;
}
QApplication
tôi muốn đề nghị sử dụng qApp->translate("context", "String")
, thay thế tr
cho bên ngoài sử dụng một QObject
lớ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_()