现在我像这样加载它们:
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_())
但我认为这很不舒服,有没有其他方法,可能加载整个命名空间或其他什么?
是的,有一种更方便的方法可以在 PySide 中从 .ui 文件加载子项。不必使用
findChild
手动搜索每个小部件,而是可以利用自动连接功能。这使可以通过名称直接访问 .ui 文件中定义的对象。
以下是使用自动连接改进代码的方法:
-
在 Qt Designer 中设置对象名称: 确保要在 .ui 文件中访问的每个小部件都有唯一的对象名称。可以在 Qt Designer 的属性编辑器中执行此操作。
-
使用
loadUiType
函数: PySide 提供了一个名为loadUiType
的函数,该函数可以将 .ui 文件分成 Python 类定义和 UI 对象。 -
从生成的类继承: 创建一个从
loadUiType
函数返回的 UI 类继承的 Python 类。 -
访问小部件: 在的自定义类中,可以通过其对象名称直接访问小部件,就好像它们是类的成员一样。
示例:
main.ui 文件(使用 Qt Designer 创建):
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<widget class="QWidget" name="centralwidget">
<widget class="QListWidget" name="listWidget">
<property name="geometry">
<rect>
<x>20</x>
<y>20</y>
<width>256</width>
<height>192</height>
</rect>
</property>
</widget>
</widget>
</widget>
</ui>
Python 代码:
import sys
from PySide6.QtWidgets import QApplication, QMainWindow
from PySide6.QtUiTools import loadUiType
Ui_MainWindow, QMainWindow = loadUiType("main.ui")
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self)
# 通过名称直接访问 listWidget
self.listWidget.addItems([f"Item {x}" for x in range(100)])
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
在此示例中,我们使用
loadUiType
加载
main.ui
文件,然后创建一个继承自生成的
Ui_MainWindow
类和
QMainWindow
的自定义
MainWindow
类。这使我们能够直接访问
listWidget
对象及其方法,而无需使用
findChild
。
此方法更清晰、更易于维护,尤其是对于包含许多小部件的复杂 UI。
标签:python,user-interface,pyside,qt-designer,uic From: 27603350