QUiLoader未从.ui fi加载布局

2024-10-02 12:35:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个应用程序插件,它提供了使用PyQt4创建小部件的能力,他们可以使用这些小部件为应用程序制作自己的工具。QApple由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())

输出。。在

^{pr2}$

所以为了解决这个问题,我去挖掘,在这里和其他地方,找到了一些亚类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中的一些bug似乎是罪魁祸首,但是我使用的pyside1.1.2已经修复了它。我甚至用1.1.3dev从源代码构建了PySide,而且还是一样。我应该补充的是,我无法在宿主应用程序之外重现此子分类问题。我能够创建一个简单的python/PySide示例,它可以按预期工作。在

从这里我要去哪里?我得到了一个漂亮的没有功能的用户界面,或者我得到了一个有功能的丑陋的用户界面。我不想对QUiLoader进行子类化,因为我没有对定制的小部件或任何东西进行任何花哨的操作。在


Tags: nameself应用程序uiinit部件deffile

热门问题