如何在我的类中继承QtWidgets.QWidget并使我的类类型 - QtWidgets.QWidget?

问题描述 投票:1回答:1

我想在Maya中制作一些代码,如果它会在下面的脚本示例中引起任何混淆,我很抱歉。问题是我想制作我的自定义PyQt类,后来在我的布局中用作Widget,但是我对这个东西缺乏知识,导致错误

# RuntimeError: '__init__' method of object's base class (test) not called. # 

我读了几个关于该错误的主题,人们建议用super()修复它。我试图把“super()”,然后我收到这个错误:

# TypeError: PySide2.QtCore.QObject isn't a direct base class of test #

有人能为我清楚这件事吗?

from PySide2 import QtGui, QtCore, QtWidgets
from shiboken2 import wrapInstance
import maya.OpenMaya as om
import maya.OpenMayaUI as omui
import maya.cmds as cmds
import os, functools


def getMayaWindow():
    pointer = omui.MQtUtil.mainWindow()
    if pointer is not None:
        return wrapInstance(long(pointer), QtWidgets.QWidget)

class testUi():
    def __init__(self):
        self.window = 'vl_test'
        self.title = 'Test Remastered'
        self.size = (1000, 650)

    def create(self):
        if cmds.window(self.window, exists=True):
            cmds.deleteUI(self.window, window=True)

        self.parentWindow = getMayaWindow()
        self.mainWindow = QtWidgets.QMainWindow(self.parentWindow)
        self.mainWindow.setObjectName(self.window)
        self.mainWindow.setWindowTitle(self.title)

        self.mainWidget = QtWidgets.QWidget()
        self.mainWindow.setCentralWidget(self.mainWidget)
        self.mainLayout = QtWidgets.QFormLayout(self.mainWidget)
        testik = test(self)
        self.mainLayout.addWidget(testik)

        self.mainButton = QtWidgets.QPushButton()
        self.mainLayout.addWidget(self.mainButton)
        self.mainButton.clicked.connect(partial(self.load_selected))


class test(QtWidgets.QWidget):
    def __init__(self, parent=None, maya_transform_nodes=[]):
        #super(QtWidgets.QWidget, self ).__init__(parent)
        qWid = QtWidgets.QWidget()
        self.setMinW = qWid.setMinimumWidth(300)
        self.setMinH = qWid.setMinimumHeight(300)
        self.sss = qWid.setStyleSheet("border:1px solid rgb(0, 255, 0); ")
        self.items = []

        self.transform_move = QtGui.QTransform()
        self.transform_scale = QtGui.QTransform()

        self.prev_mouse_pos = QtCore.QPoint(0, 0)

        self.color = QtGui.QColor(0, 255, 50, 50)
        self.clicked_color = QtGui.QColor(0, 255, 50, 150)
        self.right_clicked_color = QtGui.QColor(255, 0, 0, 150)

v = testUi()
v.create()
python pyqt pyside maya
1个回答
2
投票

当你创建一个类时,你可以选择继承另一个对象,在这种情况下可能是QDialog,因为它是你工具的主窗口。仅仅继承它是不够的,你必须调用QDialog的构造函数才能正确初始化,你可以用super来做。

使用super,您可以选择从您继承的类对象中运行方法。它看起来像这样:super(YOUR_CLASS_NAME, INSTANCE).METHOD_TO_RUN(PARAMETERS_TO_PASS)。所以更具体地说,运行你的__init__将是:super(testUi, self).__init__(parent),这将解决它。

这可能是一个糟糕的解释,所以请谷歌super更好的例子。

我对您的脚本进行了一些编辑以简化它并在其中留下一些注释:

from PySide2 import QtGui, QtCore, QtWidgets
from shiboken2 import wrapInstance
import maya.OpenMaya as om
import maya.OpenMayaUI as omui
import maya.cmds as cmds
import os, functools


def getMayaWindow():
    pointer = omui.MQtUtil.mainWindow()
    if pointer is not None:
        return wrapInstance(long(pointer), QtWidgets.QWidget)


class testUi(QtWidgets.QDialog):  # Need to inherit from a `QObject`

    def __init__(self, parent=None):  # It's typical to include the `parent` parameter and pass that through `super`.
        # If nothing was passed for parent, default to Maya's main window.
        if parent is None:
            parent = getMayaWindow()

        super(testUi, self).__init__(parent)  # Call `super` with the class's name, testUi, and its instance, self.
        self.window = 'vl_test'
        self.title = 'Test Remastered'
        self.size = (1000, 650)

        self.create()  # Just automatically call create in the instance's constructor.

    def create(self):
        if cmds.window(self.window, exists=True):
            cmds.deleteUI(self.window, window=True)

        self.setWindowTitle(self.title)
        self.resize(QtCore.QSize(*self.size))

        self.testik = test(self)  # Add `self.` so it belongs to this instance.

        self.mainButton = QtWidgets.QPushButton()

        self.mainLayout = QtWidgets.QVBoxLayout()  # QVBoxLayout seems to give a better result.
        self.mainLayout.addWidget(self.testik)
        self.mainLayout.addWidget(self.mainButton)
        self.setLayout(self.mainLayout)  # Don't forget to make this widget actually set to this layout and use it.


class test(QtWidgets.QFrame):

    def __init__(self, parent=None, maya_transform_nodes=[]):
        super(test, self).__init__(parent)  # Call `super` with the class's name, test, and its instance, self.

        self.setMinimumWidth(300)
        self.setMinimumHeight(300)
        self.setStyleSheet("QWidget {border: 1px solid rgb(0, 255, 0)};")

        self.items = []

        self.transform_move = QtGui.QTransform()
        self.transform_scale = QtGui.QTransform()

        self.prev_mouse_pos = QtCore.QPoint(0, 0)

        self.color = QtGui.QColor(0, 255, 50, 50)
        self.clicked_color = QtGui.QColor(0, 255, 50, 150)
        self.right_clicked_color = QtGui.QColor(255, 0, 0, 150)


v = testUi()
v.show()  # Call show to show it!

我是否正确地假设你正在尝试构建一个synoptics?如果是,您可能需要检查QGraphicsView以填充包含项目的窗口并处理大部分逻辑。否则你将不得不100%自己做,这可能很有趣,但很多额外的工作。

© www.soinside.com 2019 - 2024. All rights reserved.