Jawaban:
Anda akan menggunakannya QMessageBox::question
untuk 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 += widgets
Qt 5, dan CONFIG += console
pada Win32 untuk melihat qDebug()
output.
Lihat StandardButton
enum 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
).
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
}
Saya melewatkan panggilan terjemahan tr
dalam 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 Qt
kebiasaan yang baik untuk menempatkan String tingkat kode dalam tr("Your String")
panggilan.
( QMessagebox
seperti di atas bekerja dalam QWidget
metode apa pun )
EDIT:
Anda dapat menggunakan di QMesssageBox
luar QWidget
konteks, lihat jawaban @ TobySpeight.
Jika Anda bahkan berada di luar QObject
konteks, ganti tr
dengan qApp->translate("context", "String")
- Anda harus melakukannya#include <QApplication>
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 QMessageBox
objek 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
;
}
QApplication
saya sarankan menggunakan qApp->translate("context", "String")
, yang menggantikan tr
penggunaan di luar QObject
kelas
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_()