2011-10-28 11 views
12

से एक पूर्ण सिग्नल की तरह कुछ चाहिए, मैं से केवल QWidget से समाप्त सिग्नल की तरह कुछ खोज रहा हूं। कारण यह है कि विजेट एक बार पॉप अप होने पर मैं अपने टूलबार को अक्षम करता हूं (जो कि कोई समस्या नहीं है) और मैं विजेट बंद होने के बाद टूलबार को दोबारा सक्षम करना चाहता हूं।QWidget

मैं उस विजेट के क्लोज-इवेंट को ओवरराइड भी नहीं कर सकता, क्योंकि तब हमारे पास बिजनेस-क्लास में जीयूआई-कोड होगा।

+1

विजेट से संकेत मिलता है? या 'नष्ट() 'सिग्नल पकड़ो? – RedX

+2

आपकी आखिरी पंक्ति वास्तव में समझ में नहीं आता है। एक विजेट एक जीयूआई आइटम है, इसकी करीबी घटना जीयूआई कोड है। जीयूआई और व्यापार तर्क के मिश्रण का कारण क्यों ओवरराइड करना होगा? – Mat

उत्तर

14

आप विजेट सेट कर सकते हैं पास पर हटाए जाने के लिए, और उसके बाद अपने destroyed संकेत को सुनने:

widget->setAttribute(Qt::WA_DeleteOnClose); 
connect(widget, SIGNAL(destroyed(QObject*)), this, SLOT(widgetDestroyed(QObject*))); 

यही एकमात्र यदि आप विजेट सामग्री में रुचि नहीं रखते हैं तो काम करता है। बिंदु destroyed() उत्सर्जित है, विजेट अब QWidget नहीं है, केवल QObject (destroyed()~QObject से उत्सर्जित है), इसलिए आप QObject* से QWidget पर तर्क डाला नहीं जा सकता है।

QDialog के साथ अपने विजेट को लपेटने के लिए एक साधारण विकल्प हो सकता है।

+0

कि पहला व्यक्ति बहुत अच्छी तरह से काम करता है, धन्यवाद। – LarissaGodzilla

+0

हाय फ्रैंक, मैं 'widgetDestroyed' स्लॉट को कैसे कार्यान्वित करूं? – SexyBeast

+0

यह निर्भर करता है कि विजेट नष्ट होने पर आप क्या करना चाहते हैं, स्लॉट में क्या करना है इसका कोई सामान्य जवाब नहीं है। –

0

QWidget में वास्तव में कई सिग्नल नहीं हैं, दस्तावेज़ीकरण के मुताबिक इसकी कुल संख्या 2 है। हालांकि, इसका मतलब यह नहीं है कि आप स्वयं को सिग्नल निर्दिष्ट नहीं कर सकते हैं और इसका उपयोग कर सकते हैं, जो शायद सबसे अच्छी विधि है ।

9

अपनी विजेट कक्षा में, आप अपना स्वयं का सिग्नल जोड़ सकते हैं जो अन्य कनेक्ट हो सकते हैं। फिर closeEvent() विधि ओवरराइड करें। इस विधि को ओवरराइड करने के बारे में चिंता न करें, इस तरह की स्थिति बिल्कुल सही कारण है।

class MyCustomWidget: public QWidget 
{ 
    Q_OBJECT 

    ... 

    signals: 
     void WidgetClosed(); 

    protected: 

    //=============================================================== 
    // Summary: Overrides the Widget close event 
    // Allows local processing before the window is allowed to close. 
    //=============================================================== 
    void closeEvent(QCloseEvent *event); 

    } 

closeEvent विधि में अपने सिग्नल को गति प्रदान:

void MyCustomWidget::closeEvent(QCloseEvent *event) 
{ 
     emit WidgetClosed(); 
     event->accept(); 
} 
+0

मैंने पहले से ही ऐसा किया है, लेकिन किसी कारण से शायद मुझे समझ में नहीं आया होगा और जैसा कि मैंने सोचा था कि मेरे पास है, मेरी टीम के नेता इसे इस तरह से नहीं चाहते थे। लेकिन मैं उसके बारे में उससे बात करूंगा, यह देखते हुए कि अन्य संभावित तरीकों से बहुत कम समझ आती है। – LarissaGodzilla