Ya / Tidak kotak pesan menggunakan QMessageBox


108

Bagaimana cara menampilkan kotak pesan dengan tombol Ya / Tidak di Qt, dan bagaimana cara memeriksa yang mana yang ditekan?

Yaitu kotak pesan yang terlihat seperti ini:

masukkan deskripsi gambar di sini

Jawaban:


184

Anda akan menggunakannya QMessageBox::questionuntuk itu.

Contoh di slot widget hipotetis:

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

Harus bekerja pada Qt 4 dan 5, membutuhkan QT += widgetsQt 5, dan CONFIG += consolepada Win32 untuk melihat qDebug()output.

Lihat StandardButtonenum untuk mendapatkan daftar tombol yang dapat Anda gunakan; fungsi mengembalikan tombol yang diklik. Anda dapat menyetel tombol default dengan argumen tambahan (Qt " memilih default yang sesuai secara otomatis " jika Anda tidak atau menentukannya QMessageBox::NoButton).


Saya punya pertanyaan tentang cara Anda membuat kotak pesan secara dinamis: apakah lebih baik melakukannya seperti ini atau tentukan sebelumnya semuanya (buat dan simpan kotak pesan dalam variabel, dll.) Dan kemudian cukup panggil jika diperlukan?
— rbaleksandar

1
@rbaleksandar Lebih baik menggunakan metode statis QMessageBox. Qt akan membersihkan semua memori yang digunakan saat metode kembali, tidak perlu menyimpannya di memori secara permanen.
— JoshL

Terima kasih, itu masuk akal. Bagaimanapun, bagian UI ini bukanlah sesuatu yang 1) membutuhkan banyak sumber daya sehingga membutuhkan beberapa waktu untuk memuat dan 2) sering atau bahkan terus-menerus di layar bagi pengguna untuk melihatnya.
— rbaleksandar

Jawaban terbaik yang pernah ada.
— GeneCode

41

Anda dapat menggunakan objek QMessage untuk membuat Kotak Pesan lalu menambahkan tombol:

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
}

Jawaban yang menarik, bagaimana Anda menambahkan ikon ke dalamnya? Suka Informasi?
— Dariusz

1
@ Dariusz: Anda memiliki setIconmetode bagian dari QMessageBoxobjek. dengan satu jika enum ini sebagai QMessageBox::NoIcon QMessageBox::Question QMessageBox::Information parameter
— rednaks

19

QT bisa sesederhana seperti di Windows. Kode yang setara adalah

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

}

5

Saya melewatkan panggilan terjemahan trdalam jawaban.

Salah satu solusi paling sederhana, yang memungkinkan internasionalisasi nanti:

if (QMessageBox::Yes == QMessageBox::question(this,
                                              tr("title"),
                                              tr("Message/Question")))
{
    // do stuff
}

Biasanya merupakan Qtkebiasaan yang baik untuk menempatkan String tingkat kode dalam tr("Your String")panggilan.

( QMessageboxseperti di atas bekerja dalam QWidgetmetode apa pun )

EDIT:

Anda dapat menggunakan di QMesssageBoxluar QWidgetkonteks, lihat jawaban @ TobySpeight.

Jika Anda bahkan berada di luar QObjectkonteks, ganti trdengan qApp->translate("context", "String")- Anda harus melakukannya#include <QApplication>


4

QMessageBox menyertakan metode statis untuk mengajukan pertanyaan seperti itu dengan cepat:

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

Jika kebutuhan Anda lebih kompleks daripada yang disediakan oleh metode statis, Anda harus membuat QMessageBoxobjek baru , dan memanggil exec()metode tersebut untuk menampilkannya dalam loop kejadiannya sendiri dan mendapatkan pengenal tombol yang ditekan. Misalnya, kami mungkin ingin menjadikan "Tidak" sebagai jawaban default:

#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
Karena Anda sudah memasukkan QApplicationsaya sarankan menggunakan qApp->translate("context", "String"), yang menggantikan trpenggunaan di luar QObjectkelas
— DomTomCat

-2

Jika Anda ingin membuatnya dengan python, Anda perlu memeriksa kode ini di meja kerja Anda. juga menulis seperti ini. kami membuat kotak popup dengan 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_()
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.