Как перехватить событие NonClientAreaMouseMove в QEvent - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь найти способ отловить событие, когда пользователь перемещает Qdialog из titleBar. Моя цель - прикрепить событие перетаскивания, чтобы закрепить мой собственный qdialog внутри моего главного окна. (в Linux)

Другими словами, делать то, что делают dockwidget (я могу использовать 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)

Edit:

минимальный пример:

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