使用pyuic与uic.loadUi的好处 [英] Benefits of using pyuic vs uic.loadUi
问题描述
我目前正在使用Python和Qt,这对我来说是来自C++版本的新功能,我意识到在oficial documentation中,它说UI文件既可以从.ui
加载,也可以创建python类并将文件转换为.py
文件。
.ui
的好处,它是动态加载的,所以不需要在每次更改时都将其转换为python文件,但是这样做的好处是什么呢?您在运行时有什么改进吗?是其他原因吗?
谢谢
推荐答案
嗯,这个问题非常接近"基于意见"的标志,但这也是一个常见的问题,我认为它至少应该得到部分答案。
从概念上讲,使用pyuic
方法和使用uic.loadUi()
方法是相同的,行为方式非常相似,但略有不同。
为了更好地解释这一切,我将使用有关using Designer的文档作为参考。
pyuic
方法,或"python object"方法
这可能是最流行的方法,特别是在初学者中。它所做的是创建一个python对象,用于创建UI,如果遵循"单一继承"方法使用,它还充当UI本身的"接口",因为它的实例创建的ui
对象具有所有可用作其属性的小部件:如果您创建一个按钮,则它将作为ui.pushButton
可用,第一个标签将是ui.label
,依此类推。
在上面链接的文档的第一个示例中,ui
对象是独立的;这是一个非常基本的示例(我相信给出它只是为了演示它的用法,因为除了在Designer中创建的连接之外,它不会提供很多交互),而且不是很有用,但是它非常类似于单一继承方法:按钮将是self.ui.pushButton
,等等。
如果使用"多重继承"方法,ui
对象将与widget子类一致。在这种情况下,按钮将是self.pushButton
、标签self.label
等。
从python的角度来看,这非常重要,因为这意味着这些属性名称将覆盖任何将使用相同名称的其他实例属性:如果您有一个名为"saveFile"的函数,并且将按钮命名为"saveFile",那么在返回setupUi
之后,您将不再能够[直接]访问该实例方法。在这种情况下,使用单一继承方法可能会有所帮助,但实际上,您可以更小心地使用函数和对象名称。
我最近answered问了一个相关的问题,试图更深入地解释一下setupUi()
被调用时会发生什么。
使用uic.loadUi
我想说这是一种更"模块化"的方法,主要是因为它更直接:正如问题中已经指出的,您不必在每次修改UI文件时不断地重新生成它们。
但是,有一个陷阱。
首先:很明显,从XML文件加载、解析和构建UI不如直接从代码创建UI快(这正是pyuic文件在setupUi()
中所做的事情)。
loadUi
时,默认的系统/表单边距可能会被完全忽略,如果没有显式设置,则设置为0。Size of verticalLayout is different in Qt Designer and PyQt program(感谢eyllanesc)中介绍了解决方法。
比较
pyuic
方法
优点:
更快;在一个包含100个按钮和一个包含1200多个项目的表格小部件的非常简单的测试中,我测量了以下最佳性能:
- 物理加载:33.2ms
- loadUi加载:51.8ms
由于多种原因,此比率显然不是线性的,但您可以理解
- 如果与单一继承方法配合使用,可以防止意外的实例属性覆盖,也意味着对象结构更加"包容"
- 使用python导入可确保项目结构更加连贯,特别是在部署过程中(具有非python文件是常见的问题来源)
- 这些文件的内容实际上是有指导意义的,特别是对初学者
缺点:
- 您始终必须记住在每次更新UI时重新生成python文件;我们都知道忘记这样一个明显毫无意义的步骤是多么容易,特别是在几个小时的编码之后:我见过很多情况,人们因为无法追踪的问题在桌面(希望是他们的两个)上撞了几个小时,然后才意识到他们只是忘了运行pyuic或没有在正确的文件上运行它;我自己的额头还在疼
- 文件跟踪:您必须为每个UI计算两个文件,在迁移/分叉/等的过程中可能会忘记其中一个文件,如果您忘记了一个UI文件,可能意味着您必须完全从头开始重新创建
- n00b alert:初学者通常认为生成的python文件是用来创建他们的程序的,这显然是错误的;不幸的是,
# WARNING!
消息不够清楚(我几乎一直在向PyQt开发负责人请教这件事);虽然这显然不是这种方法的实际问题,但现在它导致了这样的 - pyuic生成的文件的某些内容通常是不必要的(最重要的是只在特定情况下使用的对象名称),这一点非常明显,因为它是自动生成的("您可能需要它,所以安全总比抱歉好");另外,与上述问题相关的是,人们可能会认为pyuic创建的所有内容实际上都是GUI所需的,从而导致不必要的代码降低其可读性
loadUi
方法
优点:
- 它是直接和即时的:您在Designer上编辑您的UI,然后保存它(或者至少记得这样做.),当您运行您的代码时,它已经在那里了;没有大惊小怪,没有乱七八糟的东西,桌子/前额是安全的(R)
- 文件跟踪和部署:每个UI只有一个文件,您可以将所有这些UI文件放在单独的文件夹中,无需执行任何其他操作,也不会冒着在此过程中遗漏任何东西的风险
- 直接访问小部件(但这也可以使用多重继承方法实现)
缺点:
- 上述布局问题
- 可能的实例属性覆盖,但没有"UI"对象"包含"
- 加载速度稍慢
- 路径和部署:加载是使用
os
相对路径和系统分隔符完成的,因此,如果您将UI放在与加载.ui
的py
文件不同的目录中,则必须考虑这一点;此外,一些包管理器使用来压缩所有内容,除非正确管理路径,否则会导致访问错误
在我看来,综合考虑,loadUi
方法通常是更好的选择。它不会分散我的注意力,它允许更好的概念划分(这通常很好,而且从概念上讲,它也遵循与MVC更相似的模式),我坚信它不太容易出现程序员错误,原因有很多。
但这显然是一个选择问题。
我们还应该并且始终记住,与我们所做的所有其他选择一样,使用UI文件是选项。
有些人会完全避免使用它们(因为有些人会直接使用它们做任何事情),但是,就像所有东西一样,这一切并且总是取决于上下文。
这篇关于使用pyuic与uic.loadUi的好处的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!