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.