我有一个应用程序插件,它提供了使用 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 示例。
我从这里去哪里?我得到了一个没有功能的漂亮用户界面,或者我得到了一个丑陋的用户界面。我不想对 QUiLoader 进行子类化,因为我没有对自定义小部件或任何东西做任何花哨的事情。