我有一个应用程序插件,它提供了使用PyQt4创建小部件的功能,他们可以使用这些小部件为应用程序创建自己的工具。 QApplication由C ++插件维护,“锚”小部件是主机应用程序窗口句柄的父级。然后,用户可以创建自己的小部件,并使用此“锚点”作为父小部件。这对PyQt4非常有效。最近,我一直在尝试为PySide提供支持,直到我需要从.ui文件创建小部件之前,这也一直很好。似乎当我使用QUiLoader加载我的.ui文件时,我生成的小部件看起来与PyQt4中的不同。它看起来好像缺少或跳过.ui文件中描述的布局和其他属性,例如标题。事情是当我记录该负载函数的返回值时,我得到了正确的...
class ExampleUiFile(QDialog):
def __init__(self, parent, uifilepath):
QDialog.__init__(self, parent)
# load ui file
loader = QUiLoader(self)
file = QtCore.QFile(uifilepath)
file.open(QtCore.QFile.ReadOnly)
self.ui = loader.load(file, self)
file.close()
for k,v in vars(self.ui).items():
print("%s : %s" % (k,v))
# connect to the createCube function
self.ui.uiCreateCube.clicked.connect(self.createCube)
def createCube(self):
print(self.ui.uiCubeName.text())
输出..
horizontalLayout : <PySide.QtGui.QHBoxLayout object at 0x0000000023997308>
uiCubeName : <PySide.QtGui.QLineEdit object at 0x0000000023338508>
verticalLayout :<PySide.QtGui.QVBoxLayout object at 0x0000000023997548>
gridLayout : <PySide.QtGui.QGridLayout object at 0x0000000023997E08>
uiCubeLength : <PySide.QtGui.QDoubleSpinBox object at 0x0000000023338808>
uiCreateCube : <PySide.QtGui.QPushButton object at 0x0000000023338988>
因此,为了解决这个问题,我在这里和其他地方进行了挖掘,并找到了对QUiLoader进行子类化的示例。我能够复制一个继承QUiLoader的简单类,它会做一些额外的工作来返回初始基类。这家伙似乎工作正常,我的对话框看起来正确,显示正确的标题,布局和调整大小的工作。不幸的是,垃圾收集器删除了我的加载器类创建的所有小部件,并且我收到有关我的对象被删除的消息......
class UiLoader(QUiLoader):
def __init__(self, baseinstance):
super(UiLoader, self).__init__(baseinstance)
self._baseinstance = baseinstance
def createWidget(self, classname, parent=None, name=""):
widget = super(UiLoader, self).createWidget(
classname, parent, name)
if parent is None:
return self._baseinstance
else:
setattr(self._baseinstance, name, widget)
return widget
使用新的子类加载器输出......
Internal C++ object (PySide.QtGui.QLineEdit) already deleted.
我已经在这个问题上做了很多挖掘,过去PySide中的一些错误似乎是罪魁祸首,但我正在使用PySide 1.1.2修复它。我甚至用1.1.3dev从源代码构建了PySide,但仍然是相同的。我应该补充一点,我无法在宿主应用程序之外重现这个子分类问题。我能够制作一个按预期工作的简单python / PySide示例。
我从哪里开始?我得到一个没有功能的好看的ui或者我得到了一个丑陋的ui功能。我不想对QUiLoader进行子类化,因为我没有使用自定义小部件或其他任何东西。