通过Python从.ui文件寻址Pyside Qt小部件的正确方法

2024-06-16 10:03:49 发布

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

我用Qt设计器创建了一个GUI并通过

def loadUiWidget(uifilename, parent=None):
    loader = QtUiTools.QUiLoader()
    uifile = QtCore.QFile(uifilename)
    uifile.open(QtCore.QFile.ReadOnly)
    ui = loader.load(uifile, parent)
    uifile.close()
    return ui

MainWindow = loadUiWidget("form.ui")
MainWindow.show()
children = MainWindow.children()
button1 = MainWindow.QPushButton1

“children”已经包含在UI中创建的小部件“QPushButton1”、“QTextBrowser1”,但是否应该通过reserve findChildren()方法访问?

访问.ui文件的小部件的优雅方式是什么?

参考文献: Find correct instanceLoad .ui file


Tags: ui部件defguiloaderqtparentchildren
2条回答

由于Qt Designer中的小部件名称必须是唯一的,所以层次结构(至少用于获取对小部件的引用)是扁平的(没有冲突的风险),因此最好的方法是通过以下方式访问它们:

loader = QtUiTools.QUiLoader()
ui = loader.load('filename.ui', parent)
my_widget = ui.my_widget_name

这将在Qt Designer中的变量my_widget中放置一个名为“mywidget_name”的小部件的引用。在

我想说,上面的方法是访问加载.ui文件时创建的小部件的最有效的pythonic。在

在运行时加载UI有两个缺点:

  • 每次运行程序时的开销(实际上,每次使用加载程序时)
  • 缺少对代码完成和检查的支持,因为IDE在加载uifile之前不知道ui背后的代码。在

假设您使用的是PySide的现代版本“Qt for Python”,另一种方法是将.ui文件“编译”为Python类(请参见docs)。为此,在保存filename.ui之后,执行

pyside2-uic filename.ui -o ui_mainwindow.py

在您的虚拟环境中,如果有的话。新类将被称为Ui_MainWindow。假设您的UI中有一个text_box小部件,现在可以访问它的属性和方法。下面是一个完整的工作示例:

^{pr2}$

注意事项:

  • 每次更改.ui文件后都应调用pyside2uic。与OP相比,这是这种方法的一个缺点。它还意味着您应该同时控制ui的.ui和.py文件,或者在部署期间调用uic。在
  • 最大的优势是,像PyCharm这样的IDE可以访问所有小部件方法和属性,以进行自动完成和代码检查。在
  • 到今天为止,pyside2uic创建了不兼容PEP8的代码。但是,只要你给你的widgets提供PEP8兼容的名称,你自己的代码就可以了。在

相关问题 更多 >