使用Python和Qt6(PySide6)创建GUI应用1简介

1 简介

在本书从GUI开发的基本原理逐步过渡到使用PySide6创建您自己的、功能齐全的桌面应用程序。

1.1 GUI简史

图形用户界面(GUI Graphical User Interface) 历史悠久,可追溯到20世纪60年代。斯坦福大学的NLS(ON-Line 系统引入了鼠标和窗口概念,并于1968年首次公开展示。随后,施乐公司于1973年推出了Smalltalk系统图形用户界面,它是大多数现代通用图形用户界面的基础。

这些早期系统已经具备了我们在现代桌面图形用户界面中视为理所当然的许多功能,包括窗口、菜单、单选按钮、复选框和后来的图标。这些功能的组合为我们提供了这类界面的早期缩写: WIMP(窗口、图标、菜单、指向设备--鼠标 windows, icons, menus, pointing device — a mouse)。

1979年,第一款采用图形用户界面的商用系统PERQ工作站问世。这刺激了其他一些图形用户界面的发展,其中最著名的是苹果公司的Lisa(1983年),它增加了菜单栏和窗口控制的概念。还有许多其他系统,如 Atari ST (GEM)、Amiga。在 UNIX(以及后来的 Linux)上,1984 年出现了 X 窗口系统。第一版 Windows PC 于 1985 年发布。

早期的图形用户界面并不像我们想象的那样一经推出就大受欢迎,原因是当时缺乏兼容的软件,而且硬件要求昂贵,尤其是对家庭用户而言。随着时间的推移,图形用户界面逐渐成为人们与电脑交互的首选方式,WIMP隐喻也被牢固地确立为标准。这并不是说没有人试图在桌面上取代WIMP。例如,微软公司在 1995年推出的 Microsoft Bob(微软鲍勃),就是微软公司试图用房子来取代桌面的尝试。

从推出Windows 95(1995 年)到Mac OS X(2001 年)、GNOME Shell(2011 年)和 Windows 10(2015 年),不乏其他被誉为革命性的图形用户界面。这些系统都对各自桌面系统的用户界面进行了大刀阔斧的改革,而且往往大张旗鼓。但从根本上说,并没有什么真正的改变。这些新的用户界面在很大程度上仍然是WIMP系统,其功能与20世纪80年代以来的图形用户界面完全相同。

革命自触摸,窗口被全屏应用程序取代。但大量的日常工作仍然是在台式电脑上完成的。WIMP经历了40年的创新,并有望继续走下去。

1.2 QT简介

Qt是一个免费的开源widget工具包,用于创建跨平台图形用户界面应用程序,允许应用程序使用单一代码库针对Windows、macOS、Linux和Android等多个平台。但Qt远不止是widget工具包,它还内置了对多媒体、数据库、矢量图形和MVC界面的支持,将其视为应用程序开发框架更为准确。

Qt由Eirik Chambe-Eng 和 Haavard Nord于1991 年创立,并于1994年成立了第一家Qt公司Trolltech。Qt目前由The Qt Company开发,并继续定期更新,增加功能,扩展移动和跨平台支持。

1.2.1 Qt和PySide6

PySide6也称为Qt for Python,是Qt工具包的Python绑定,目前由Qt公司开发。当您使用PySide6编写应用程序时,您实际上是在用Qt编写应用程序。PySide6库只是C++ Qt 库的一个封装,可在Python中使用它。

PySide6中使用的命名约定并不符合PEP8标准。最值得注意的是,函数和变量使用mixedCase而不是 snake_case来命名。你是否在自己的应用程序中遵循这一标准完全取决于你自己,但我发现遵循Python标准很有帮助,有助于明确PySide6代码的终点和你自己代码的起点。

最后,虽然有PySide6的特定文档,但你经常会发现自己在阅读Qt文档,因为它更完整。

1.2.2 Pythonic PySide6

在Python中,特性导入用于控制代码的全局行为。在Qt 5.15中引入了一项功能,使Qt对象可以使用蛇形变量名和方法名。在Qt6中,这一功能被扩展为支持从Python代码直接访问Qt属性,而不是使用 getter/setter 函数。下面的示例代码显示了这些变化对代码的影响 - 清单 1.

  • 标准 PySide6 代码。
table = QTableWidget()
table.setColumnCount(2)

button = QPushButton("Add")
button.setEnabled(False)

layout = QVBoxLayout()
layout.addWidget(table)
layout.addWidget(button)

同样的代码,但启用了snake_case和true_property。

from __feature__ import snake_case, true_property

table = QTableWidget()
table.column_count = 2

button = QPushButton("Add")
button.enabled = False

layout = QVBoxLayout()
layout.add_widget(table)
layout.add_widget(button)

这些功能有助于Qt代码更加Pythonic,通过遵循Python代码风格标准来提高代码的可读性。

参考资料

1.3 补充知识:Widget

在计算机科学和软件开发领域,Widget(小部件)是指用户界面中的一个可视化组件或控件,用于显示信息、接收用户输入或执行特定的功能。Widget通常是图形用户界面(GUI)中的一个可交互的元素,可以是按钮、文本框、下拉菜单、滑块等。

Widget的主要目的是提供用户与应用程序或系统之间的交互方式,使用户能够与应用程序进行操作、输入数据或获取信息。通过使用不同类型的Widget,开发人员可以构建丰富多样的用户界面,以满足不同的需求和提供良好的用户体验。

Widget通常具有以下特点:

  • 可视化:Widget以图形的形式在用户界面中显示,并提供了一个可视化的方式来呈现信息或控制功能。
  • 交互性:Widget允许用户与其进行交互,例如点击按钮、拖动滑块、选择下拉菜单等,从而触发特定的操作或更改应用程序的状态。
  • 可配置性:Widget通常具有一些可配置的属性,如大小、颜色、字体等,使开发人员能够根据需求自定义其外观和行为。
  • 可重用性:Widget可以在不同的应用程序或不同的部分中重复使用,以提高代码的复用性和可维护性。

常见的Widget库和框架如HTML/CSS中的Web Widget,Android中的Android Widget,以及各种GUI工具包(如Qt、GTK、WPF等)中提供的各种控件都是用于构建和管理Widget的工具。

热门相关:一个人的一往情深   写给鼹鼠先生的情书   酒店供应商   凤逆天下:腹黑魔君妖娆后   一个人的一往情深