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

sashoalm
sumber

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

Tikar
sumber
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
}
rednaks
sumber
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()) 
{

}
hkyi
sumber
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>

DomTomCat
sumber
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
        ;
}
Toby Speight
sumber
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_()
Rajendra Prasad Taidala
sumber