QUiLoader没有从.ui文件加载布局

时间:2013-05-11 00:23:45

标签: python windows pyside

我有一个应用程序插件,它提供了使用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进行子类化,因为我没有使用自定义小部件或其他任何东西。

0 个答案:

没有答案