我目前正在使用python和Qt,这对我来说是来自C++版本的新东西,我意识到在官方文档中它说UI文件可以从python类加载.ui
或创建一个python类并将文件转换为.py
文件.
我得到了使用.ui
它的好处是动态加载的,所以每次更改都不需要将它转换成 python 文件,但是这样做有什么好处?,你在运行时有什么改进吗?是别的吗?
谢谢
好吧,这个问题非常接近“基于意见”的标志,但它也是一个常见的问题,我相信它至少应该得到部分答案。
从概念上讲,使用pyuic
方法和uic.loadUi()
方法都是相同的,并且行为方式非常相似,但有一些细微差别。
为了更好地解释这一切,我将使用有关使用 Designer的文档作为参考。
pyuic
方法,或“python对象”方法这可能是最流行的方法,尤其是在初学者中。它所做的是创建一个用于创建 ui 的 python 对象,如果按照“单一继承”方法使用,它还充当 ui 本身的“接口”,因为ui
它的实例创建的对象具有所有小部件作为它的属性可用:如果你创建一个按钮,它将作为 可用ui.pushButton
,第一个标签将是ui.label
等等。
在上面链接的文档的第一个示例中,该ui
对象是独立的;这是一个非常基本的示例(我相信它只是为了演示其用法,因为除了在 Designer 中创建的连接之外,它不会提供很多交互)并且不是很有用,但它与单继承方法非常相似:按钮将是self.ui.pushButton
等。
如果使用“多重继承”方法,ui
对象将与小部件子类重合。在这种情况下,按钮将是self.pushButton
、标签self.label
等。
从 python 的角度来看,这非常重要,因为这意味着这些属性名称将覆盖任何其他使用相同名称的实例属性:如果您有一个名为“saveFile”的函数并且您将按钮命名为“saveFile”,您一旦返回,将不再有任何 [直接] 访问该实例方法setupUi
。在这种情况下,使用单一继承方法可能会有所帮助 - 但实际上,您可能会更加注意函数和对象名称。
最后,如果您不知道 pyuic 生成的文件的作用和用途,您可能倾向于使用它来创建程序。出于很多原因,这是错误的,但最重要的是,因为您可能肯定会在某些时候意识到您必须编辑您的 ui,并且将新更改与修改后的代码合并显然是您不想面对的 PITA .
我最近回答了一个相关问题,试图setupUi()
更深入地解释调用时会发生什么。
uic.loadUi
我想说这是一种更“模块化”的方法,主要是因为它更直接:正如问题中已经指出的那样,您不必在每次修改 ui 文件时都不断地重新生成它们。
但是,有一个问题。
首先:显然,从 XML 文件加载、解析和构建 UI 不如直接从代码创建 ui 快(这正是 pyuic 文件在其中所做的setupUi()
)。
然后,关于布局内容边距至少有一个相对较小的错误:使用时loadUi
,默认的系统/表单边距可能会被完全忽略,如果没有明确设置,则设置为 0。有一个解决方法,在Size of verticalLayout 在 Qt Designer 和 PyQt 程序中有所不同(感谢eyllanesc)中解释。
pyuic
方法优点:
它更快;在一个包含一百个按钮和一个包含 1200 多个项目的 tablewidget 的非常简单的测试中,我测量了以下最佳结果:
由于多种原因,这个比率显然不是线性的,但你可以明白
缺点:
# WARNING!
是,消息不够清楚(我几乎一直在向 PyQt 开发人员求教);虽然这显然不是这种方法的实际问题,但现在它会导致loadUi
方法优点:
缺点:
os
不同的目录中,则必须考虑这一点;此外,一些包管理器用于压缩所有内容,除非正确管理路径,否则会导致访问错误py
.ui
在我看来,综合考虑,该loadUi
方法通常是更好的选择。它不会分散我的注意力,它允许更好的概念划分(这通常很好,并且在概念上更接近于类似于 MVC 的模式)并且我坚信它更不容易出现程序员错误,对于众多原因。
但这显然是一个选择问题。
我们还应该并且永远记住,就像我们所做的所有其他选择一样,使用 ui 文件是一种选择。
有些人完全避免使用它们(因为有些人将它们从字面上用于任何事情),但是,就像所有事情一样,这一切都取决于上下文。