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

时间:2013-02-14 09:01:14

标签: c++ qt qdockwidget

我在QStackedWidge内有一个QDockWidget - 取决于显示的页面,我希望显示/隐藏QDockWidget上的关闭按钮。我可以使用QDockWidget::setFeatures()

来完成此操作

然而,我面临的问题是如何捕获关闭按钮的信号,以便我可以更改停靠功能/设置堆叠的小部件页面索引。

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()

2 个答案:

答案 0 :(得分:2)

事实证明除visibilityChanged信号之外的所有事情都有效!

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

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

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

答案 1 :(得分:0)

基于DockWidget创建一个新的CloseDockWidget。

重写closeEvent()方法,但从那里发出附加的close()信号。

小部件/qclosedockwidget.cpp

#include "qclosedockwidget.h"

namespace Widgets
{
    QCloseDockWidget::QCloseDockWidget(const QString &title, QWidget *parent) 
    : QDockWidget(title, parent)
    {
        // constructor
    }

    void QCloseDockWidget::closeEvent(QCloseEvent *event)
    {
        emit closed(); // <------ signal

        QDockWidget::closeEvent(event);
    }
} // namespace Widgets

小部件/qclosedockwidget.h

#ifndef QCLOSEDOCKWIDGET_H
#define QCLOSEDOCKWIDGET_H

#include <QDockWidget>

namespace Widgets
{

    class QCloseDockWidget : public QDockWidget
    {
        Q_OBJECT

    public:
        QCloseDockWidget(const QString &title = "", QWidget *parent = nullptr);

    protected:
        void closeEvent(QCloseEvent *event);
    signals:
        void closed();
    };

} // namespace Widgets

#endif // QCLOSEDOCKWIDGET_H

现在您可以实例化并连接到新信号:

auto *dockWidget = new Widgets::QCloseDockWidget("MyDockWidget", this);

connect(dockWidget, &Widgets::QCloseDockWidget::closed, this, &MainWindow::dockWidgetCloseClicked);