在PySide2中为UI文件使用.py文件的好处?

问题描述 投票:0回答:1

我目前正在使用python和Qt,这对我来说是C ++版本的新增功能,我意识到在oficial documentation中它表示可以从.ui或创建python类中加载UI文件并将文件转换为.py文件。

我获得了使用.ui的好处,因此它是动态加载的,因此无需进行任何更改就可以将其转换为python文件,但是这样做有什么好处呢?,您在运行时得到了什么改进吗?还有其他吗?

谢谢

qt pyqt pyside2
1个回答
0
投票

嗯,这个问题很危险地接近“基于意见的”标志,但这也是一个常见的问题,我认为它至少应得到部分回答。

从概念上讲,使用pyuic方法和uic.loadUi()方法都是相同的,并且行为方式非常相似,但有一些细微的差异。为了更好地解释所有这些,我将使用有关using Designer的文档作为参考。

[pyuic方法,或“ python对象”方法]

这可能是最受欢迎的方法,尤其是在初学者中。它的作用是创建一个用于创建ui的python对象,如果遵循“ singleInheritance”方法使用,它也将充当ui本身的“接口”,因为ui其实例创建的对象具有所有可用的小部件作为其属性:如果创建按钮,则它将以ui.pushButton的形式使用,第一个标签为ui.label,依此类推。

在上面链接的文档的第一个示例中,ui对象是独立的;那是一个非常基本的示例(我相信给出它只是为了演示其用法,因为它除了在Designer中创建的连接之外不会提供很多交互),并且不是很有用,但是它与单一继承方法非常相似:该按钮将是self.ui.pushButton,等等。>使用

IF

“多重继承”方法,ui对象将与小部件子类重合。在这种情况下,按钮将为self.pushButton,标签为self.label等。>

从python的角度来看,这非常重要,因为这意味着这些属性名称将覆盖将使用相同名称的any其他实例属性:如果您有一个名为“ saveFile”的函数,并且将其命名为按钮“ saveFile”,则一旦返回setupUi,您将不再具有对该实例方法的任何[直接]访问。在这种情况下,使用单一继承方法可能会有所帮助-但实际上,您可以更加小心函数和对象名称。

最后,如果您不知道pyuic生成的文件的功能以及它的用途,您可能会倾向于使用它来创建程序。出于很多原因,这是错误的,但是,最重要的是,因为您可能肯定会意识到必须编辑ui,并且将新更改与修改后的代码合并显然是您不想面对的PITA 。

我最近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方法

优点:

  • 更快;在一个非常简单的测试中,使用一百个按钮和一个包含1200多个项的tablewidget,我测出了以下最佳成绩:

    • 深度加载:33.2ms
    • loadUi载入:51.8ms

      由于多种原因,该比率显然不是线性的,但是您可以理解这个主意

  • 如果与单一继承方法一起使用,它可以防止意外的实例属性覆盖,并且还意味着一个更“包含”的对象结构
  • 使用python导入可确保项目结构更连贯,尤其是在部署过程中(具有非python文件是常见的问题根源]
  • 这些文件的内容实际上是有启发性的,特别是对于初学者
  • 缺点:

    • 总是
    • 必须记住要重新生成python文件每次
    更新ui;我们都知道忘记这样一个看起来毫无意义的步骤是多么容易,尤其是经过几个小时的编码之后:我发现很多情况下,人们由于无法追踪的问题而在桌子上(最好是两个人)猛烈地挥舞着头,在意识到他们只是忘记运行pyuic或未在正确的文件上运行pyuic之前;我自己的额头仍然很痛;-)
  • 文件跟踪:您必须为每个ui计数two个文件,并且在迁移/分叉/ etc时可能会忘记其中的一个,如果您忘记了一个ui文件,则可能意味着您必须从头开始完全重建它
  • n00b警报
  • :初学者通常会认为生成的python文件是用于创建程序的文件,这显然是错误的;不幸的是,# WARNING!消息不够清晰(我一直在恳求PyQt首席开发人员对此);尽管这显然不是此方法的实际问题,但现在导致它是这样]通常不需要pyuic生成的文件的
  • some
  • 内容(最重要的是,对象名称,仅用于特定情况),这很明显,因为它是自动生成的(“您可能需要,因此比后悔更安全”);另外,与上述问题相关,人们可能会认为,pyuic创建的所有内容实际上都是GUI所需的,从而导致不必要的代码,从而降低了其可读性]

    loadUi方法

    优点:

    • 它是直接的和直接的:您在Designer上编辑ui,然后保存(或至少记得记得这样做...),并且在运行代码时它已经存在;没有大惊小怪,没有头脑,桌子/额头很安全(r)
  • 文件跟踪和部署:每个ui只是一个文件,您可以将所有ui文件放在一个单独的文件夹中,您无需执行其他任何操作,也不必担心会遗忘某些内容
  • 直接访问小部件(但是也可以使用多重继承方法来实现)
  • 缺点:

    • 上述布局问题
    • 可能的实例属性覆盖,并且没有“ ui”对象“包含”
  • 加载速度稍慢
  • 路径和部署:加载是使用os相对路径和系统分隔符完成的,因此,如果将ui放置在与加载py.ui文件不同的目录中,则必须考虑这一点;另外,某些程序包管理器使用压缩所有内容,除非正确管理路径,否则会导致访问错误

  • [我认为,考虑到所有因素,loadUi方法通常是更好的选择。它不会分散我的注意力,它可以更好地进行概念划分(通常很好,并且遵循与MVC相似的模式),并且出于多种原因,我坚信它不那么容易出现程序员错误。

    但这显然是一个选择问题。

    我们还应始终记住,像我们所做的其他选择一样,使用ui文件是option。有些人会完全避免使用它们(因为有些人会在字面上将它们用于任何事物),但是对于所有事物,这全都取决于上下文。

    © www.soinside.com 2019 - 2024. All rights reserved.