我有一个应用程序插件,它提供了使用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进行子类化,因为我没有对定制的小部件或任何东西进行任何花哨的操作。在
目前没有回答
相关问题 更多 >
编程相关推荐