У меня есть QStackedWidge
t в пределах QDockWidget
- в зависимости от того, какая страница отображается, я хочу показать/скрыть кнопку закрытия на QDockWidget
. Я могу сделать это, используя QDockWidget::setFeatures()
.Как захватить событие нажатия кнопки закрытия QDockWidget
Однако проблема, с которой я столкнулся, заключается в том, как захватить сигнал кнопки закрытия, чтобы я мог изменить функции док-станции/установить индекс уложенных страниц виджета.
Я попытался использовать фильтр событий:
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()
никогда не вызывается, когда кнопка закрытия была нажата.
Я использовал сигнал QObject :: destroy(), как описано в http://stackoverflow.com/questions/7091830/qt-destructor-call-for-closed-widget – vrogach