首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在QEvent中捕获NonClientAreaMouseMove事件

如何在QEvent中捕获NonClientAreaMouseMove事件
EN

Stack Overflow用户
提问于 2019-07-03 18:16:23
回答 1查看 337关注 0票数 0

我试图找到一种方法来捕获事件,当用户从titleBar移动Q对话框时。我的目标是附加一个拖动事件,将我的自定义qdialog停靠在我的mainWindow中。(在Linux上)

换句话说,做dockwidget做的事情(我可以使用dockwidget)我必须用Custom Q对话框(或带有Qt.Window标志的小部件)做同样的事情。

与QDockWidget相比,我在c++ Qt源代码中看到,他们使用这样的东西:

代码语言:javascript
复制
bool QDockWidget::event(QEvent *event)
{   [...]
  case QEvent::NonClientAreaMouseMove:
  case QEvent::NonClientAreaMouseButtonPress:
  case QEvent::NonClientAreaMouseButtonRelease:
  case QEvent::NonClientAreaMouseButtonDblClick:
      d->nonClientAreaMouseEvent(static_cast<QMouseEvent*>(event));

但是当我尝试在pyside上捕捉这种事件时,我什么也没有收到:

代码语言:javascript
复制
    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实现拖拽事件)

编辑:

一个最小的例子:

代码语言:javascript
复制
 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()
EN

回答 1

Stack Overflow用户

发布于 2020-06-19 20:50:13

您需要安装事件过滤器:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56867860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档