1

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

4

0 回答 0