2013-02-14 14 views
5

Mam QStackedWidge t w obrębie - w zależności od tego, która strona jest wyświetlana Chcę pokazać/ukryć przycisk zamykania na QDockWidget. Mogę to zrobić za pomocą QDockWidget::setFeatures().Jak przechwycić zdarzenie zamykania przycisku QDockWidget kliknij przycisk

Jednak problemem, przed którym stoję, jest przechwytywanie sygnału przycisku zamykania, aby można było zmienić funkcje dokowania/ustawić indeks ułożonych stron widżetów.

QDockWidget close button

próbowałem użyć filtra zdarzeń:

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

i zainstalowany jako tak:

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

W konstruktorze mojego QMainWindow - metody eventFilter() nie zostać wezwanym.

Więc następnym próbowałem użyć QDockWidget::visibilityChanged zmieniony sygnał, ponieważ brzmiało to jak to może być to, co chciałem:

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

Gniazdo to nie nazywa się - ale nie wtedy, gdy w pobliżu przycisk został kliknięty.

W końcu próbowałem użyć promowanego QDockWidget do przechwytywania QWidget::closeEvent().

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

Widziałem konstruktor nazwano co oznacza ten nowy widżet był rzeczywiście używany, ale znowu nie radość od closeEvent() nigdy nie nazwano po blisko przycisk został kliknięty.

Odpowiedz

0

Okazuje się, że wszystko oprócz sygnału visibilityChanged działa!

Dodałem sygnał do przesłoniętej metody closeEvent(), którą mogę następnie podłączyć do dowolnego żądanego gniazda.

Rzeczywistym problemem było to, że w stosie widżetu miałem inną QDockWidget na innej stronie, dlatego dodałem wszystkie te rzeczy do niewłaściwego QDockWidget! (I oczywiście awansował też niewłaściwy QDockWidget zbyt!).

Mam nadzieję, że to pytanie może służyć jako odniesienie do każdego, kto musi wymyślić, jak to zrobić - a nie dlaczego nie działa.

+0

Użyłem sygnału QObject :: destroyed() zgodnie z opisem w http://stackoverflow.com/questions/7091830/qt-destructor-call-for-closed-widget – vrogach

Powiązane problemy