简体   繁体   English

如何在 QEvent 中捕获 NonClientAreaMouseMove 事件

[英]How to catch NonClientAreaMouseMove event in QEvent

I try to find a way to catch event when user move Qdialog from titleBar.当用户从 titleBar 移动 Qdialog 时,我尝试找到一种捕获事件的方法。 My goal is to attach a drag event to dock my custom qdialog inside my mainWindow.我的目标是附加一个拖动事件以将我的自定义 qdialog 停靠在我的 mainWindow 中。 (on Linux) (在 Linux 上)

In other terms, do what dockwidgets do (I can use dockwidget) I have to do the same with Custom Qdialog (or widget with Qt.Window flags)换句话说,做dockwidgets做的事情(我可以​​使用dockwidget)我必须用自定义Qdialog(或带有Qt.Window标志的小部件)做同样的事情

I see in c++ Qt source code than for QDockWidget, They use this kind of stuff:我在 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));

But when I try to catch this kind of event on pyside, I recieve nothin:但是当我尝试在 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

Any idea how to do this ?知道如何做到这一点吗? (or another idea how to realize a drag event with qdialog) (或另一个想法如何使用 qdialog 实现拖动事件)

Edit:编辑:

a minimal example:一个最小的例子:

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

You need to install an event filter:您需要安装一个事件过滤器:

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)

See also: https://doc.qt.io/qt-5/eventsandfilters.html另见: https : //doc.qt.io/qt-5/eventsandfilters.html

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM