Hộp thông báo Có / Không sử dụng QMessageBox


108

Làm cách nào để hiển thị hộp thông báo có các nút Có / Không trong Qt và làm cách nào để kiểm tra xem chúng đã được nhấn vào nút nào?

Tức là một hộp thông báo trông như thế này:

nhập mô tả hình ảnh ở đây

Câu trả lời:


184

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).


Tôi có một câu hỏi liên quan đến cách bạn tạo động hộp thông báo: tốt hơn là làm như vậy hay xác định trước toàn bộ (tạo và lưu trữ hộp thông báo trong một biến, v.v.) và sau đó chỉ cần gọi nó khi cần?
rbaleksandar

1
@rbaleksandar Tốt hơn là sử dụng các phương thức tĩnh QMessageBox. Qt sẽ dọn sạch bất kỳ bộ nhớ nào được sử dụng khi các phương thức quay trở lại, không cần phải giữ vĩnh viễn một bộ nhớ trong bộ nhớ.
JoshL

Cảm ơn, nó có ý nghĩa. Xét cho cùng, phần này của giao diện người dùng không phải là thứ mà 1) đòi hỏi nhiều tài nguyên, do đó mất một thời gian để tải và 2) thường xuyên hoặc thậm chí liên tục trên màn hình để người dùng nhìn thấy nó.
rbaleksandar

Câu trả lời hay nhất đến nay.
GeneCode

41

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
}

Câu trả lời thú vị, bạn sẽ thêm một biểu tượng vào nó như thế nào? Thích Thông tin?
Dariusz

1
@Dariusz: bạn có phần 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
rednaks

19

QT có thể đơn giản như của Windows. Mã tương đương là

if (QMessageBox::Yes == QMessageBox(QMessageBox::Information, "title", "Question", QMessageBox::Yes|QMessageBox::No).exec()) 
{

}

5

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>


4

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
        ;
}

2
Kể từ khi bạn đã đưa 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
DomTomCat

-2

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_()
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.