PYQT Maya QMouseEvent 在我 wrapInstance 之后不起作用

PYQT Maya QMouseEvent won't work after I wrapInstance it

from PySide2 import QtGui,QtCore,QtWidgets
from PySide2.QtGui import*
from PySide2.QtCore import *
from PySide2.QtWidgets import *
from shiboken2 import wrapInstance
import maya.OpenMayaUI as mui
import sys
class ui(QWidget):
    def __init__(self,parent):
        super(ui,self).__init__(parent)
        self.resize(300,500)
        self.mainWindow = QtWidgets.QMainWindow(parent)
        self.setupUI(self.mainWindow)
        self.setFocus()
    def setupUI(self,mainWindow):
        mymainWindow = QWidget(mainWindow)
        mymainWindow.resize(300,500)
    def mousePressEvent(self,e):
        print 'sdfasdf'
        if e.button()==Qt.RightButton:
            print "Clickkkk"
    def Show(self):
        self.mainWindow.show()
class app():
    def __init__(self):
        self.ptr = mui.MQtUtil.mainWindow()
        self.ptr = wrapInstance(long(self.ptr),QtWidgets.QWidget)      
        self.ui = ui(self.ptr)
    def runApp(self):
        self.ui.Show()
        self.ui.setFocus()

tt = app()
tt.runApp()

这是我正在测试的代码。使用 wrapInstance 后,mouseEvent 不再有效。

但如果我不包装它就可以了

不工作

class app():
    def __init__(self):
        self.ptr = mui.MQtUtil.mainWindow()
        self.ptr = wrapInstance(long(self.ptr),QtWidgets.QWidget)      
        self.ui = ui(self.ptr)
    def runApp(self):
        self.ui.Show()
        self.ui.setFocus()

工作

我也在 UI class

中更改了一些父结构
class app():
    def __init__(self):    
        self.ui = ui()
    def runApp(self):
        self.ui.Show()

谁能解释为什么 MouseEvent 在我包装后不起作用?以及如何让它发挥作用?

问题的关键在于:self.ui.Show()。这会运行您的自定义方法,而该方法又会运行此 self.mainWindow.show()。这会导致显示 self.mainWindow,但您将 mousePressEvent 子类化为 ui,而不是 self.mainWindow!所以这不是 运行 事件,因为您点击了错误的小部件。

相反,由于 uiQWidget,调用 self.ui.show()。您可能还必须将 self.setWindowFlags(QtCore.Qt.Window) 放入 ui 的构造函数中。这样,当用户单击它时,鼠标事件将按预期运行。

一些旁注:

我怀疑您是否真的想在 QWidget 中创建一个 QMainWindow。它看起来很奇怪。考虑对 QMainWindow 进行子类化,因为它应该是 'top' 小部件。

也尽量避免导入像 from PySide2.QtCore import * 这样的模块,而是像这样导入它们 from PySide2 import QtCore。这是一种不好的做法,会污染模块的范围,并使代码变得更多 unreadable/un-maintainable 因为很难追溯这些变量的来源。

哦,看在上帝的份上,使用一些垂直的白色间距 :)