如何在 QEvent 中捕获 NonClientAreaMouseMove 事件
Posted
技术标签:
【中文标题】如何在 QEvent 中捕获 NonClientAreaMouseMove 事件【英文标题】:How to catch NonClientAreaMouseMove event in QEvent 【发布时间】: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()
【问题讨论】:
【参考方案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
【讨论】:
以上是关于如何在 QEvent 中捕获 NonClientAreaMouseMove 事件的主要内容,如果未能解决你的问题,请参考以下文章
Python:在 QListWidget 中捕获重新排序事件?
如何在 Android 上注册 ACTION_VIEW Intent?为啥我的 QApplication 没有收到 QEvent::FileOpen 事件?