у меня есть QStackedWidge
т в течение QDockWidget
— в зависимости от того, какая страница отображается, я хочу показать / скрыть кнопку закрытия на QDockWidget
, Я могу сделать это с помощью QDockWidget::setFeatures()
,
Однако проблема, с которой я сталкиваюсь, заключается в том, как захватить сигнал кнопки закрытия, чтобы я мог изменить функции док-станции / установить индекс страницы сложенного виджета.
Я попытался использовать фильтр событий:
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()
никогда не вызывался при нажатии кнопки закрытия.
Оказывается, что все, кроме visibilityChanged
сигнал работает!
Я добавил сигнал в переопределенный closeEvent()
метод, который я мог бы затем подключить к любому слоту, который я хотел.
Фактическая проблема заключалась в том, что в сложенном виджете у меня был другой QDockWidget
на другой странице, следовательно, я добавлял все это неправильно QDockWidget
! (И конечно добавлять неправильно QDockWidget
тоже дох!).
Надеемся, что этот вопрос может послужить ссылкой на кого-то еще, кто должен выяснить, как это сделать, а не почему он не работает.
Других решений пока нет …