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
!所以这不是 运行 事件,因为您点击了错误的小部件。
相反,由于 ui
是 QWidget
,调用 self.ui.show()
。您可能还必须将 self.setWindowFlags(QtCore.Qt.Window)
放入 ui
的构造函数中。这样,当用户单击它时,鼠标事件将按预期运行。
一些旁注:
我怀疑您是否真的想在 QWidget
中创建一个 QMainWindow
。它看起来很奇怪。考虑对 QMainWindow
进行子类化,因为它应该是 'top' 小部件。
也尽量避免导入像 from PySide2.QtCore import *
这样的模块,而是像这样导入它们 from PySide2 import QtCore
。这是一种不好的做法,会污染模块的范围,并使代码变得更多 unreadable/un-maintainable 因为很难追溯这些变量的来源。
哦,看在上帝的份上,使用一些垂直的白色间距 :)
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
!所以这不是 运行 事件,因为您点击了错误的小部件。
相反,由于 ui
是 QWidget
,调用 self.ui.show()
。您可能还必须将 self.setWindowFlags(QtCore.Qt.Window)
放入 ui
的构造函数中。这样,当用户单击它时,鼠标事件将按预期运行。
一些旁注:
我怀疑您是否真的想在 QWidget
中创建一个 QMainWindow
。它看起来很奇怪。考虑对 QMainWindow
进行子类化,因为它应该是 'top' 小部件。
也尽量避免导入像 from PySide2.QtCore import *
这样的模块,而是像这样导入它们 from PySide2 import QtCore
。这是一种不好的做法,会污染模块的范围,并使代码变得更多 unreadable/un-maintainable 因为很难追溯这些变量的来源。
哦,看在上帝的份上,使用一些垂直的白色间距 :)