如何在QEven中捕获非clientareamousemove事件

2024-09-22 16:42:22 发布

您现在位置:Python中文网/ 问答频道 /正文

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

换句话说,做dockwidget所做的(我可以使用dockwidget),我必须对自定义Qdialog(或具有Qt.窗口(标志)

我在c++Qt源代码中看到,QDockWidget比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()

Tags: fromimportselfeventmaindeftype事件