如何在 QEvent 中捕获 NonClientAreaMouseMove 事件

Posted

技术标签:

【中文标题】如何在 QEvent 中捕获 NonClientAreaMouseMove 事件【英文标题】:How to catch NonClientAreaMouseMove event in QEvent 【发布时间】:2019-07-03 10:16:22 【问题描述】:

当用户从 titleBar 移动 Qdialog 时,我试图找到一种方法来捕获事件。 我的目标是附加一个拖动事件以将我的自定义 qdialog 停靠在我的主窗口中。 (在 Linux 上)

换句话说,做dockwidgets做的事情(我可以​​使用dockwidget)我必须对Custom Qdialog(或带有Qt.Window标志的小部件)做同样的事情

我在 c++ Qt 源代码中看到的比 QDockWidget 的,他们使用这种东西:

bool QDockWidget::event(QEvent *event)
   [...]
  case QEvent::NonClientAreaMouseMove:
  case QEvent::NonClientAreaMouseButtonPress:
  case QEvent::NonClientAreaMouseButtonRelease:
  case QEvent::NonClientAreaMouseButtonDblClick:
      d->nonClientAreaMouseEvent(static_cast<QMouseEvent*>(event));

但是当我试图在 pyside 上捕捉这种事件时,我什么也没收到:

    def event(self, e):
      print('event %s' % e.type())
      return super(myDyalig,self).event(e)

event PySide2.QtCore.QEvent.Type.ActivationChange
event PySide2.QtCore.QEvent.Type.UpdateRequest
event PySide2.QtCore.QEvent.Type.Paint
# I recieve only this move event when user stop moving (when he 
#  release  the button)
event PySide2.QtCore.QEvent.Type.Move 
event PySide2.QtCore.QEvent.Type.WindowActivate
event PySide2.QtCore.QEvent.Type.ActivationChange
event PySide2.QtCore.QEvent.Type.UpdateRequest
event PySide2.QtCore.QEvent.Type.Paint

知道怎么做吗? (或另一种想法如何使用 qdialog 实现拖动事件)

编辑:

一个最小的例子:

 from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *

class CustomDialog(QDialog):

    def __init__(self, parent=None):
        super(CustomDialog,self).__init__(parent)
        self.setFixedSize(QSize(200,200))

    def event(self, e):
        print('event %s' % e.type())
        return super(CustomDialog,self).event(e)

def main():
    import sys
    app = QApplication(sys.argv)
    dial = CustomDialog()
    dial.show()

    sys.exit(app.exec_())
if __name__ == '__main__':
    main()

【问题讨论】:

【参考方案1】:

你需要安装一个事件过滤器:

def __init__(self, parent=None):
    super().__init__(parent)

    #...

    self.installEventFilter(self)

def eventFilter(self, obj, event):
    if event.type() in (QEvent.NonClientAreaMouseButtonPress, QEvent.NonClientAreaMouseButtonPress, QEvent.Move):
        print(event)
    return super().eventFilter(obj, event)

另请参阅:https://doc.qt.io/qt-5/eventsandfilters.html

【讨论】:

以上是关于如何在 QEvent 中捕获 NonClientAreaMouseMove 事件的主要内容,如果未能解决你的问题,请参考以下文章

如何丢弃 QEvent 而不是忽略它

Python:在 QListWidget 中捕获重新排序事件?

如何在 Android 上注册 ACTION_VIEW Intent?为啥我的 QApplication 没有收到 QEvent::FileOpen 事件?

Qt事件

QT中QTableWidget鼠标事件捕获

QEventfilter 类的全局事件捕获