2012-09-18 11 views
14

मैंने QMessageBox जैसी कार्यक्षमता को लागू करने के लिए QDialog उपखंडित किया है (मुझे अनुकूलन की अनुमति देने के लिए इसकी आवश्यकता है)। इसमें एक टेक्स्ट संदेश है और ठीक है, बटन रद्द करें। मैं इसे अवरुद्ध करने के लिए exec() का उपयोग करके संवाद दिखा रहा हूं। अब, जब मैं ठीक/रद्द करता हूं तो मैं सत्य/झूठे मूल्यों को कैसे वापस कर सकता हूं?QDialog exec() और परिणाम मान प्राप्त करना

मैं setResult() करने के लिए बटन को जोड़ने की कोशिश की और उसके बाद, परिणाम मान क्लिक किए जाने पर, लेकिन 1. बटन पर क्लिक करने से संवाद बॉक्स 2. वापसी मान बंद नहीं होती है सही नहीं है। मेरे द्वारा लिखे गए कोड के बाद निम्नलिखित है। मुझे लगता है कि मैं निष्पादन/परिणाम भाग में गलत हूं - लेकिन मुझे यकीन नहीं है कि इसे कैसे ठीक किया जाए।

class MyMessageBox : public QDialog 
{ 
    Q_OBJECT 

private slots: 

    void onOKButtonClicked(){ this->setResult(QDialog::Accepted);} 
    void onCancelButtonClicked(){ this->setResult(QDialog::Rejected);} 

public: 

    MyMessageBox(QMessageBox::Icon icon, const QString & title, const QString & text, bool showCancelButton = true, QWidget *parent = 0); 

    virtual void resizeEvent(QResizeEvent* e); 

     QDialog::DialogCode showYourself() 
     { 
      this->setWindowModality(Qt::ApplicationModal); 
      this->exec(); 
      return static_cast<QDialog::DialogCode>(this->result()); 
     } 

    }; 

उपयोगकर्ता वर्ग संवाद का दृष्टांत होगा और showYourself फोन() मान लौटने की उम्मीद है जो और भी करीब (और हटाएं)।

मैंने आंशिक कोड पोस्ट किया है। अगर आपको और चाहिए तो मुझे बताएं और मैं पूरा संस्करण पोस्ट करूंगा।

उत्तर

15

कुछ अंक:

  1. बल्कि खुद setResult() का उपयोग करने से, QDialog::accept() और QDialog::reject() का उपयोग करें।
  2. ऐसा लगता है कि आप सिग्नल और स्लॉट का पूरा लाभ नहीं ले रहे हैं। आपको उस ऑब्जेक्ट की आवश्यकता है जो संवाद के संकेतों को सुनने के लिए संवाद (या कोई अन्य) बनाता है।
  3. अपने कोड में आप स्लॉट्स को सिग्नल कनेक्ट नहीं कर रहे हैं।
  4. मेरे फिक्स onOKButtonClicked और onCancelButtonClicked अनावश्यक हैं।
  5. मेरे ठीक होने के साथ आपको showYourself() की आवश्यकता नहीं है। बस exec पर कॉल करें और घटनाओं के साथ जानकारी बह जाएगी।

आप संवाद (this मान यह एक संवाद विधि में है) दिखाने से पहले इस कोड को जोड़ने की जरूरत है:

QObject::connect(acceptButton, SIGNAL(clicked()), this, SLOT(accept())); 
QObject::connect(rejectButton, SIGNAL(clicked()), this, SLOT(reject())); 

फोन करने वाले वस्तु में आप

void someInitFunctionOrConstructor(){ 
    QObject::connect(mydialog, SIGNAL(finished (int)), this, SLOT(dialogIsFinished(int))); 
} 

void dialogIsFinished(int){ //this is a slot 
    if(result == QDialog::Accepted){ 
     //do something 
     return 
    } 
    //do another thing 
} 
+0

धन्यवाद! वह प्रबुद्ध है। अगर मैं ऐसा करता हूं, तो क्या मुझे वस्तु को स्पष्ट रूप से हटाने की ज़रूरत है, या क्या यह आंतरिक रूप से देखभाल की जाती है? – go4sri

+0

यदि ऑब्जेक्ट में कोई अभिभावक है तो माता-पिता को हटा दिए जाने पर इसे हटा दिया जाता है। आप हटाए जाने के लिए 'QObject :: deleteLater()' का उपयोग कर सकते हैं। जब आप यह सुनिश्चित करने के लिए जानते हैं कि किसी ऑब्जेक्ट का अब और उपयोग नहीं किया जाता है (इस ऑब्जेक्ट से संबंधित कोई ईवेंट आसपास नहीं है) तो आप पुराने पुराने डिलीट का उपयोग कर सकते हैं। – UmNyobe

+0

बहुत अच्छा जवाब! धन्यवाद! – Victor

8

केस 1 बटन क्लिक करने से संवाद बॉक्स बंद नहीं होता है।

यह आप संबंधित SLOTS पर संवाद बंद है, इसलिए का उपयोग करें

void onOKButtonClicked(){ this->setResult(QDialog::Accepted); this->close();} 
void onCancelButtonClicked(){ this->setResult(QDialog::Rejected);this->close();} 

नोट करने के लिए है के लिए: के बाद ही आप ठीक बटन क्लिक किया या बटन रद्द एक मानक QMessageBox में है, setResult() फ़ंक्शन शुरू हो रहा है और स्थिति बदल दी गई है। इसके विपरीत होने पर यह वही प्रभाव नहीं है।

केस 2 वापसी मूल्य गलत है।

मुझे लगता है कि आपके संवाद बंद होने के बाद ही, परिणाम result() फ़ंक्शन में उपलब्ध होगा। तो मुझे लगता है कि यह केस 1 में निर्दिष्ट परिवर्तन किए जाने के बाद हल हो जाएगा।

यदि यह अभी भी बनी रहती है, तो इसे हल करने के लिए अपने निजी सदस्य फ़ंक्शन का उपयोग करें।

+0

धन्यवाद। यह काम करता है। – go4sri

+4

इसे कॉल करने के बाद-> बंद करें() सेट-> setResult (QDialog :: स्वीकृत); परिणाम 1 से 1 के बजाय 0 होने का कारण बन जाएगा। तो बंद करने के बाद setResult() को कॉल करें() – ManuelH

14

एक अन्य समाधान है:

// set signal and slot for "Buttons" 
    connect(YesButton, SIGNAL(clicked()), dlg, SLOT(accept())); 
    connect(NoButton, SIGNAL(clicked()), dlg, SLOT(reject())); 

    // show modal window event loop and wait for button clicks 
    int dialogCode = dlg->exec(); 

    // act on dialog return code 
    if(dialogCode == QDialog::Accepted) { // YesButton clicked } 
    if(dialogCode == QDialog::Rejected) { // NoButton clicked } 
संबंधित मुद्दे