ฉันจะแสดงกล่องข้อความที่มีปุ่มใช่ / ไม่ใช่ใน Qt ได้อย่างไรและฉันจะตรวจสอบได้อย่างไรว่าปุ่มใดถูกกด?
ได้แก่ กล่องข้อความที่มีลักษณะดังนี้:
ฉันจะแสดงกล่องข้อความที่มีปุ่มใช่ / ไม่ใช่ใน Qt ได้อย่างไรและฉันจะตรวจสอบได้อย่างไรว่าปุ่มใดถูกกด?
ได้แก่ กล่องข้อความที่มีลักษณะดังนี้:
คำตอบ:
คุณจะใช้QMessageBox::question
สำหรับสิ่งนั้น
ตัวอย่างในสล็อตของวิดเจ็ตสมมุติฐาน:
#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";
}
}
ควรทำงานบน Qt 4 และ 5 ต้องใช้QT += widgets
Qt 5 และCONFIG += console
บน Win32 เพื่อดูqDebug()
ผลลัพธ์
ดูStandardButton
enum เพื่อรับรายการปุ่มที่คุณสามารถใช้ได้ ฟังก์ชันจะส่งคืนปุ่มที่ถูกคลิก คุณสามารถตั้งค่าปุ่มเริ่มต้นด้วยอาร์กิวเมนต์พิเศษ (Qt " เลือกค่าเริ่มต้นที่เหมาะสมโดยอัตโนมัติ " หากคุณไม่ระบุหรือไม่ระบุQMessageBox::NoButton
)
คุณสามารถใช้วัตถุ QMessage เพื่อสร้างกล่องข้อความจากนั้นเพิ่มปุ่ม:
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
}
setIcon
ส่วนเมธอดของQMessageBox
object ด้วยหนึ่งถ้า enums เหล่านี้เป็นพารามิเตอร์: QMessageBox::NoIcon
QMessageBox::Question
QMessageBox::Information
doc.qt.io/qt-4.8/qmessagebox.html#icon-prop
QT สามารถทำได้ง่ายเหมือน Windows รหัสเทียบเท่าคือ
if (QMessageBox::Yes == QMessageBox(QMessageBox::Information, "title", "Question", QMessageBox::Yes|QMessageBox::No).exec())
{
}
ฉันไม่ได้รับสายแปล tr
ในคำตอบ
หนึ่งในวิธีแก้ปัญหาที่ง่ายที่สุดซึ่งช่วยให้สามารถสร้างความเป็นสากลในภายหลังได้
if (QMessageBox::Yes == QMessageBox::question(this,
tr("title"),
tr("Message/Question")))
{
// do stuff
}
โดยทั่วไปเป็นQt
นิสัยที่ดีที่จะใส่สตริงระดับรหัสไว้ในการtr("Your String")
โทร
( QMessagebox
ข้างต้นใช้งานได้ภายในQWidget
วิธีการใด ๆ)
แก้ไข:
คุณสามารถใช้QMesssageBox
นอกQWidget
บริบทดูคำตอบของ @ TobySpeight
หากคุณอยู่นอกQObject
บริบทให้แทนที่tr
ด้วยqApp->translate("context", "String")
- คุณจะต้อง#include <QApplication>
QMessageBox
รวมถึงวิธีการคงที่เพื่อถามคำถามดังกล่าวอย่างรวดเร็ว:
#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
;
}
หากความต้องการของคุณซับซ้อนกว่าที่กำหนดโดยวิธีการแบบคงที่คุณควรสร้างQMessageBox
ออบเจ็กต์ใหม่และเรียกexec()
ใช้เมธอดเพื่อแสดงในลูปเหตุการณ์ของตัวเองและรับตัวระบุปุ่มที่กด ตัวอย่างเช่นเราอาจต้องการให้ "ไม่" เป็นคำตอบเริ่มต้น:
#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
ฉันขอแนะนำให้ใช้qApp->translate("context", "String")
ซึ่งแทนที่tr
การใช้งานนอกQObject
คลาส
หากคุณต้องการสร้างเป็น python คุณต้องตรวจสอบรหัสนี้ในโต๊ะทำงานของคุณ เขียนแบบนี้ด้วย เราสร้างกล่องป๊อปอัพด้วย 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_()