How to capture the QDockWidget close button click event

I have QStackedWidget inside QDockWidget- depending on which page is shown. I want to show / hide the close button on QDockWidget. I can do it using QDockWidget::setFeatures().

However, the problem I am facing is how to capture the close button signal so that I can change the functions of the dock / set the page index by page.

QDockWidget close button

I tried using an event filter:

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 );
}

And installed it like this:

EventFilter* filter = new EventFilter( this );
u->dockWidget_6->installEventFilter( filter );

In the constructor of my method QMainWindow, eventFilter()it was not called.

So, next time I tried to use the modified signal QDockWidget::visibilityChanged, because it sounded like it might be what I wanted:

connect( u->dockWidget_6, SIGNAL(visibilityChanged(bool)), SLOT(dockWindowClosed(bool)) );

This slot was called, but not by pressing the close button.

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

+8
2

, , visibilityChanged, !

closeEvent(), , .

, QDockWidget , QDockWidget! (, , QDockWidget doh!).

, - , , , .

+2

CloseDockWidget DockWidget.

closeEvent(), closed().

/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);
0

All Articles