2013-02-14 30 views
5

पर मेरे पास QStackedWidge टी QDockWidget के भीतर है - इस पृष्ठ के आधार पर कि मैं QDockWidget पर बंद बटन को दिखाना/छिपाना चाहता हूं। मैं QDockWidget::setFeatures() का उपयोग करके ऐसा कर सकता हूं।QDockWidget बंद करें बटन को कैप्चर करने के लिए कैसे करें

हालांकि मुझे जिस मुद्दे का सामना करना पड़ रहा है वह है कि बंद बटन के सिग्नल को कैप्चर करना है ताकि मैं डॉक फीचर्स को बदल सकूं/स्टैक्ड विजेट पेज इंडेक्स सेट कर सकूं।

QDockWidget close button

मैं एक घटना फिल्टर का उपयोग करने का प्रयास किया:

class EventFilter : public QObject 
{ 
    Q_OBJECT 
public: 
    EventFilter(QObject* aParent); 
protected: 
    bool eventFilter(QObject *obj, QEvent *event); 
}; 

EventFilter::EventFilter(QObject* aParent) 
    : QObject(aParent) 
{ 

} 

bool EventFilter::eventFilter(QObject *obj, QEvent *event) 
{ 
    if (event->type() == QEvent::Close) 
    { 
     return true; 
    } 
    return QObject::eventFilter(obj, event); 
} 

और यह के रूप में तो स्थापित:

EventFilter* filter = new EventFilter(this); 
u->dockWidget_6->installEventFilter(filter); 

मेरी QMainWindow के निर्माता में - eventFilter() विधि नहीं था बुलाओ

तो अगली मैं QDockWidget::visibilityChanged बदली हुई संकेत का उपयोग करने का प्रयास किया है, क्योंकि यह इस तरह लग रहा था हो सकता है कि मैं क्या चाहता था:

connect(u->dockWidget_6, SIGNAL(visibilityChanged(bool)), SLOT(dockWindowClosed(bool))); 

इस स्लॉट बुलाया मिला है - लेकिन जब बंद करें बटन क्लिक किया गया था।

अंततः मैंने QWidget::closeEvent() पर कब्जा करने के लिए प्रचारित QDockWidget का उपयोग करने का प्रयास किया।

class DockWidgetWithCloseSignal : public QDockWidget 
    { 
     Q_OBJECT 
    public: 
     explicit DockWidgetWithCloseSignal(const QString &title, QWidget *parent = 0, Qt::WindowFlags flags = 0) 
     : QDockWidget(title, parent, flags) 
    { 

    } 

    explicit DockWidgetWithCloseSignal(QWidget *parent = 0, Qt::WindowFlags flags = 0) 
: QDockWidget(parent, flags) 
    { 

    } 
protected: 
    void closeEvent(QCloseEvent *event) 
    { 
     event->ignore(); 
    } 
}; 

मैंने देखा निर्माता कहा जाता था इस नए विजेट वास्तव में किया जा रहा था, जिसका अर्थ है, लेकिन फिर से closeEvent() के बाद से कोई खुशी बुलाया कभी नहीं किया गया था जब बंद करें बटन क्लिक किया गया था।

उत्तर

0

यह बताता है कि visibilityChanged सिग्नल के अलावा सब कुछ काम करता है!

मैंने ओवरराइड closeEvent() विधि को एक संकेत जोड़ा जो मैं चाहता था कि मैं किसी भी स्लॉट से कनेक्ट कर सकूं।

वास्तविक मुद्दा यह था कि स्टैक्ड विजेट के भीतर मेरे पास एक और पेज पर QDockWidget था, इसलिए मैं इन सभी चीजों को गलत QDockWidget पर जोड़ रहा था! (और निश्चित रूप से गलत QDockWidget को भी बढ़ावा दिया!)।

उम्मीद है कि यह प्रश्न किसी और के संदर्भ के रूप में कार्य कर सकता है जिसे यह पता लगाने की आवश्यकता है कि यह क्यों काम नहीं कर रहा है।

+0

मैंने QObject :: नष्ट() संकेत का उपयोग किया है जैसा कि http://stackoverflow.com/questions/7091830/qt-destructor-call-for-closed-widget में वर्णित है – vrogach