【问题标题】:How to catch NonClientAreaMouseMove event in QEvent如何在 QEvent 中捕获 NonClientAreaMouseMove 事件
【发布时间】: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()

【问题讨论】:

    标签: python qt qt5 pyside2


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-10
      • 2012-05-21
      • 2012-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多