【问题标题】:How do I load children from .ui file in PySide?如何从 PySide 中的 .ui 文件加载子级?
【发布时间】:2015-02-20 14:11:33
【问题描述】:

现在我像这样加载它们:

if __name__ == '__main__':
    app = QApplication(sys.argv)
    loader = QUiLoader()
    file = QFile('main.ui')
    file.open(QFile.ReadOnly)
    window = loader.load(file)
    file.close()
    window.show()
    # Here:
    window.centralwidget.findChild(QListWidget, 'listWidget').addItems(['Item {0}'.format(x) for x in range(100)])
    sys.exit(app.exec_())

但我认为这很不舒服,有没有其他方法,可能加载整个命名空间或其他什么?

【问题讨论】:

  • 对不起,我误读了你的问题,猜测使用 .ui 和 PySide 的默认方式是使用 pyside-uic 生成模块。至于动态方法QUiLoader相当有限。

标签: python qt user-interface pyside


【解决方案1】:

目前,PySide QUiLoader 类没有像PyQt uic module 那样将小部件加载到顶级类实例的便捷方法。

但是,添加等价的东西相当容易:

from PySide import QtGui, QtCore, QtUiTools

class UiLoader(QtUiTools.QUiLoader):
    _baseinstance = None

    def createWidget(self, classname, parent=None, name=''):
        if parent is None and self._baseinstance is not None:
            widget = self._baseinstance
        else:
            widget = super(UiLoader, self).createWidget(classname, parent, name)
            if self._baseinstance is not None:
                setattr(self._baseinstance, name, widget)
        return widget

    def loadUi(self, uifile, baseinstance=None):
        self._baseinstance = baseinstance
        widget = self.load(uifile)
        QtCore.QMetaObject.connectSlotsByName(widget)
        return widget

然后可以这样使用:

class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(self, parent)
        UiLoader().loadUi('main.ui', self)
        self.listWidget.addItems(['Item {0}'.format(x) for x in range(100)])

为了使其正常工作,loadUibaseinstance 参数必须是 Qt Designer 文件中顶级类的实例。然后将所有其他小部件作为实例属性添加到其中。

【讨论】:

    猜你喜欢
    • 2011-10-31
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多