PYQT Maya QMouseEvent не будет работать после того, как я заверну его - PullRequest
0 голосов
/ 28 февраля 2020
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()

работает

I Также изменить некоторую родительскую структуру в классе пользовательского интерфейса

class app():
    def __init__(self):    
        self.ui = ui()
    def runApp(self):
        self.ui.Show()

Может кто-нибудь объяснить, почему MouseEvent не будет работать после того, как я заверну его? И как заставить это работать?

1 Ответ

0 голосов
/ 28 февраля 2020

Суть проблемы заключается в следующем: self.ui.Show(). Это запускает ваш пользовательский метод, который в свою очередь запускает этот self.mainWindow.show(). Это заставляет self.mainWindow показывать, но вы подкласс mousePressEvent для ui, а не self.mainWindow! Так что это событие не запускается, потому что вы нажимаете на неправильный виджет.

Вместо этого, поскольку ui - это QWidget, позвоните self.ui.show(). Возможно, вам также придется поместить self.setWindowFlags(QtCore.Qt.Window) в конструктор ui. При этом событие мыши запускается, как и ожидалось, когда пользователь нажимает на него.

Некоторые примечания:

Я сомневаюсь, что вы действительно хотите создать QMainWindow в QWidget. Это кажется странным. Вместо этого рассмотрите возможность подкласса QMainWindow, так как он должен быть виджетом 'top'.

Также старайтесь избегать импорта таких модулей, как from PySide2.QtCore import *, и импортируйте их вот так вместо from PySide2 import QtCore. Это плохая практика, загрязняет область действия вашего модуля и делает код намного более нечитаемым / не обслуживаемым, так как трудно отследить, откуда берутся эти переменные.

О, и, ради бога, используйте немного вертикального белого -пространство:)

...