【问题标题】:How to capture the QDockWidget close button click event如何捕获 QDockWidget 关闭按钮单击事件
【发布时间】: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


    【解决方案1】:

    事实证明,除了visibilityChanged 信号之外的所有东西都有效!

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

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

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

    【讨论】:

    【解决方案2】:

    基于 DockWidget 创建一个新的 CloseDockWidget。

    重写 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);
    

    【讨论】:

      猜你喜欢
      • 2012-02-23
      • 1970-01-01
      • 1970-01-01
      • 2014-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-28
      相关资源
      最近更新 更多