ใช่ / ไม่ใช่กล่องข้อความโดยใช้ QMessageBox


109

ฉันจะแสดงกล่องข้อความที่มีปุ่มใช่ / ไม่ใช่ใน Qt ได้อย่างไรและฉันจะตรวจสอบได้อย่างไรว่าปุ่มใดถูกกด?

ได้แก่ กล่องข้อความที่มีลักษณะดังนี้:

ใส่คำอธิบายภาพที่นี่

คำตอบ:


185

คุณจะใช้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 += widgetsQt 5 และCONFIG += consoleบน Win32 เพื่อดูqDebug()ผลลัพธ์

ดูStandardButtonenum เพื่อรับรายการปุ่มที่คุณสามารถใช้ได้ ฟังก์ชันจะส่งคืนปุ่มที่ถูกคลิก คุณสามารถตั้งค่าปุ่มเริ่มต้นด้วยอาร์กิวเมนต์พิเศษ (Qt " เลือกค่าเริ่มต้นที่เหมาะสมโดยอัตโนมัติ " หากคุณไม่ระบุหรือไม่ระบุQMessageBox::NoButton)


ฉันมีคำถามเกี่ยวกับวิธีที่คุณสร้างกล่องข้อความแบบไดนามิก: จะดีกว่าไหมหากทำเช่นนี้หรือกำหนดสิ่งทั้งหมดไว้ล่วงหน้า (สร้างและจัดเก็บกล่องข้อความในตัวแปร ฯลฯ ) แล้วเรียกมันเมื่อจำเป็น?
rbaleksandar

1
@rbaleksandar ใช้วิธี QMessageBox แบบคงที่จะดีกว่า Qt จะล้างหน่วยความจำที่ใช้เมื่อวิธีการคืนค่าไม่จำเป็นต้องเก็บหน่วยความจำไว้อย่างถาวร
JoshL

ขอบคุณมันสมเหตุสมผลแล้ว หลังจากทั้งหมดส่วนนี้ของ UI ไม่ใช่สิ่งที่ 1) ต้องใช้ทรัพยากรจำนวนมากจึงต้องใช้เวลาในการโหลดและ 2) มักจะอยู่บนหน้าจอบ่อยๆหรือตลอดเวลาเพื่อให้ผู้ใช้เห็น
rbaleksandar

คำตอบที่ดีที่สุดที่เคยมีมา
GeneCode

41

คุณสามารถใช้วัตถุ 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
}

คำตอบที่น่าสนใจคุณจะเพิ่มไอคอนได้อย่างไร ชอบข้อมูล?
Dariusz

1
@Dariusz: คุณมีsetIconส่วนเมธอดของQMessageBoxobject ด้วยหนึ่งถ้า enums เหล่านี้เป็นพารามิเตอร์: QMessageBox::NoIcon QMessageBox::Question QMessageBox::Information doc.qt.io/qt-4.8/qmessagebox.html#icon-prop
rednaks

19

QT สามารถทำได้ง่ายเหมือน Windows รหัสเทียบเท่าคือ

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

}

5

ฉันไม่ได้รับสายแปล 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>


4

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

2
เนื่องจากคุณได้รวมไว้แล้วQApplicationฉันขอแนะนำให้ใช้qApp->translate("context", "String")ซึ่งแทนที่trการใช้งานนอกQObjectคลาส
DomTomCat

-2

หากคุณต้องการสร้างเป็น 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_()
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.