如何在我的 class 中继承 QtWidgets.QWidget 并使我的 class 类型为 - QtWidgets.QWidget?
How to inherit QtWidgets.QWidget in my class and make my class type - QtWidgets.QWidget?
我正在尝试在 Maya 中编写一些代码,如果这会在下面的脚本示例中造成任何混淆,我深表歉意。
问题是我想制作我的自定义 PyQt class,稍后将在我的布局中用作小部件,但我对这件事缺乏了解,导致错误
# 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()
当您创建 class 时,您可以选择从另一个对象继承,在本例中可能是 QDialog
,因为它是您工具的主要 window。仅仅继承它是不够的,你必须调用 QDialog
的构造函数才能正确初始化,你可以使用 super
.
使用 super
,您可以选择 运行 从您的 class 对象继承的方法。它看起来像这样:super(YOUR_CLASS_NAME, INSTANCE).METHOD_TO_RUN(PARAMETERS_TO_PASS)
。所以更具体地说,运行 你的 __init__
它将是:super(testUi, self).__init__(parent)
,这将解决它。
这可能是一个糟糕的解释,所以请 Google 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!
我假设您正在尝试构建天气图是否正确?如果是,您可能需要查看 QGraphicsView
以使用项目填充 window 并处理大部分逻辑。否则你将不得不 100% 自己完成,这可能很有趣,但需要做很多额外的工作。
我正在尝试在 Maya 中编写一些代码,如果这会在下面的脚本示例中造成任何混淆,我深表歉意。 问题是我想制作我的自定义 PyQt class,稍后将在我的布局中用作小部件,但我对这件事缺乏了解,导致错误
# 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()
当您创建 class 时,您可以选择从另一个对象继承,在本例中可能是 QDialog
,因为它是您工具的主要 window。仅仅继承它是不够的,你必须调用 QDialog
的构造函数才能正确初始化,你可以使用 super
.
使用 super
,您可以选择 运行 从您的 class 对象继承的方法。它看起来像这样:super(YOUR_CLASS_NAME, INSTANCE).METHOD_TO_RUN(PARAMETERS_TO_PASS)
。所以更具体地说,运行 你的 __init__
它将是:super(testUi, self).__init__(parent)
,这将解决它。
这可能是一个糟糕的解释,所以请 Google 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!
我假设您正在尝试构建天气图是否正确?如果是,您可能需要查看 QGraphicsView
以使用项目填充 window 并处理大部分逻辑。否则你将不得不 100% 自己完成,这可能很有趣,但需要做很多额外的工作。