【发布时间】:2014-07-16 23:44:40
【问题描述】:
所以我有一个应用程序,我正在考虑从 PyQt4 迁移到 PySide。在这个应用程序中,我经常使用.ui 文件,使用模式如下:
class BaseGUIWidget(QWidget):
def __init__(self, parent = None, ui_file = None):
'''
:param parent: parent widget of this widget
:param ui_file: path to UI file to load (optional)
'''
super(BaseGUIWidget, self).__init__(parent)
if ui_file is not None:
uic.loadUi(ui_file, self)
假设我对QFrame、QMainWindow、QGroupBox 等有类似的课程。
这允许我创建使用 UI 文件中的数据的 python 类,以及我在代码中手动添加的任何附加功能。从本质上讲,我的BaseGUIWidget 类的行为就像是在扩展由 UI 文件生成的类。应用程序中的许多功能都非常依赖这种行为。
但是,据我所知,PySide 的QUIloader 没有类似的功能。它不是将 UI 文件的内容“填充”到您的类中,而是简单地在内部从 UI 文件构建一个小部件,然后返回它,然后您将它嵌入到您的小部件中 layout 就像任何其他小部件一样。,IE :
class BaseGUIWidget(QWidget):
def __init__(self, parent = None, ui_file = None):
'''
:param parent: parent widget of this widget
:param ui_file: path to UI file to load (optional)
'''
super(BaseGUIWidget, self).__init__(parent)
self.setLayout(QVBoxLayout())
if ui_file is not None:
loader = QUILoader()
uifile = QFile(ui_file)
uifile.open(QFile.ReadOnly)
self.ui_widget = loader.load(ui_file, self)
self.layout().addWidget(self.ui_widget)
uifile.close()
这是一个相当大的差异。例如,如果您希望您的 UI 文件包含 QMainWindow 并且您的 python 类仍然是 QMainWindow 的扩展,因此它与其他类一样,您最终会在一个 QMainWindow 内QMainWindow,这不是你想要的。这也意味着您必须执行 widget.ui_widget.XXX 才能访问 UI 文件生成的小部件。
有什么方法可以让 PySide 的 uic 实现像 PyQt 的一样?
【问题讨论】:
标签: python qt python-2.7 pyqt4 pyside