2013-02-14 2 views
5

У меня есть QStackedWidge t в пределах 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))); 

Этот слот действительно дозвонились - но не тогда, когда кнопка закрытия была нажата.

Наконец-то я попытался использовать продвинутый QDockWidget для захвата 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(); 
    } 
}; 

Я видел конструктор был вызван, который означает, что этот виджет действительно используется, но опять-таки не радость, так как closeEvent() никогда не вызывается, когда кнопка закрытия была нажата.

ответ

0

Оказывается, что все, кроме сигнала visibilityChanged, работает!

Я добавил сигнал к переопределенному методу closeEvent(), который затем смог подключиться к любому слоту, который я хотел.

Фактическая проблема заключалась в том, что внутри уложенного виджета у меня был еще один QDockWidget на другой странице, поэтому я добавлял все эти вещи в неправильные QDockWidget! (И, конечно, продвигался неправильно QDockWidget тоже doh!).

Надеюсь, этот вопрос может служить ссылкой на кого-либо еще, который должен выяснить, как это сделать, а не почему он не работает.

+0

Я использовал сигнал QObject :: destroy(), как описано в http://stackoverflow.com/questions/7091830/qt-destructor-call-for-closed-widget – vrogach

Смежные вопросы