QMessageBox का उपयोग करके हां / नहीं संदेश बॉक्स


108

मैं क्यूटी में हां / नहीं बटन के साथ एक संदेश बॉक्स कैसे दिखाता हूं, और मैं कैसे जांचूं कि उनमें से कौन दबाया गया था?

एक संदेश बॉक्स जो इस तरह दिखता है:

यहां छवि विवरण दर्ज करें

जवाबों:


184

आप उसके लिए उपयोग 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";
  }
}

क्यूटी 4 और 5 पर काम करना चाहिए, QT += widgetsक्यूटी 5 पर आवश्यकता है , और आउटपुट CONFIG += consoleदेखने के लिए Win32 पर qDebug()

StandardButtonआपके द्वारा उपयोग किए जा सकने वाले बटनों की सूची प्राप्त करने के लिए enum देखें ; फ़ंक्शन उस बटन को लौटाता है जिसे क्लिक किया गया था। आप एक अतिरिक्त तर्क के साथ एक डिफ़ॉल्ट बटन सेट कर सकते हैं ( यदि आप नहीं या निर्दिष्ट करते हैं तो Qt " एक उपयुक्त डिफ़ॉल्ट स्वचालित रूप से चुनता है " QMessageBox::NoButton)।


मेरे पास एक प्रश्न है जिस तरह से आप संदेश बॉक्स को गतिशील रूप से उत्पन्न करते हैं: क्या यह इस तरह से करना बेहतर है या पूरी चीज़ को पूर्वनिर्धारित करें (संदेश बॉक्स को एक चर आदि में बनाएं और संग्रहीत करें) और फिर बस जरूरत पड़ने पर इसे कॉल करें?
rbaleksandar

1
@rbaleksandar QMessageBox स्थिर विधियों का उपयोग करना बेहतर है। क्यूटी किसी भी स्मृति को साफ कर देगा जब विधियाँ वापस आती हैं, तो स्थायी रूप से स्मृति में एक को रखने की कोई आवश्यकता नहीं है।
जोशेल

धन्यवाद, यह समझ में आता है। आखिरकार यूआई का यह हिस्सा कुछ ऐसा नहीं है कि 1) के लिए बहुत सारे संसाधनों की आवश्यकता होती है, इस प्रकार लोड होने में कुछ समय लगता है और 2) उपयोगकर्ता को इसे देखने के लिए स्क्रीन पर अक्सर या लगातार होता है।
rbaleksandar

सबसे अच्छा जवाब कभी।
जिंककोड

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
}

दिलचस्प जवाब, आप इसमें एक आइकन कैसे जोड़ेंगे? सूचना की तरह?
दारिउज़

1
@ दाराज़: आपके पास ऑब्जेक्ट setIconका मेथड पार्ट है QMessageBox। एक के रूप में अगर ये इन QMessageBox::NoIcon QMessageBox::Question QMessageBox::Information पैराशूटर्स के
rednaks

19

क्यूटी विंडोज की तरह सरल हो सकता है। समकक्ष कोड है

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
हूं

-2

यदि आप इसे अजगर में बनाना चाहते हैं, तो आपको इस कोड को अपने कार्यक्षेत्र में जांचना होगा। इस तरह भी लिखें। हमने अजगर के साथ एक पॉपअप बॉक्स बनाया।

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_()
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.