【发布时间】:2013-01-30 00:49:01
【问题描述】:
我在QDockWidget 中有一个QStackedWidget - 根据显示的页面,我希望显示/隐藏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 changed 信号,因为听起来这可能是我想要的:
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()。
【问题讨论】:
标签: c++ qt qdockwidget