[英]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.