如何捕获QDockWidget关闭按钮单击事件

pau*_*ulm 8 c++ qt qdockwidget

我有一个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 );
}
Run Code Online (Sandbox Code Playgroud)

并安装如下:

EventFilter* filter = new EventFilter( this );
u->dockWidget_6->installEventFilter( filter );
Run Code Online (Sandbox Code Playgroud)

在我的构造函数中QMainWindow- 该eventFilter()方法没有被调用.

接下来我尝试使用QDockWidget::visibilityChanged改变后的信号,因为听起来这可能是我想要的:

connect( u->dockWidget_6, SIGNAL(visibilityChanged(bool)), SLOT(dockWindowClosed(bool)) );
Run Code Online (Sandbox Code Playgroud)

这个插槽确实被调用了 - 但是当点击关闭按钮时却没有.

最后我尝试使用提升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();
    }
};
Run Code Online (Sandbox Code Playgroud)

我看到构造函数被调用,这意味着这个新的小部件确实被使用了,但是再次没有快乐,因为closeEvent()单击关闭按钮时从未调用过.

pau*_*ulm 3

事实证明,除了信号之外,一切都正常visibilityChanged

我向重写的方法添加了一个信号closeEvent(),然后我可以将其连接到我想要的任何插槽。

实际的问题是,在堆叠的小部件中,我QDockWidget在另一个页面上有另一个小部件,因此我将所有这些东西添加到了错误的位置QDockWidget!(当然,QDockWidget也推广了错误的内容!)。

希望这个问题可以为其他需要弄清楚如何做到这一点的人提供参考 - 而不是为什么它不起作用。