0%

python gui与pyside

简介

  • Tkinter – Tcl/Tk的python接口,python标准库自带不需单独安装。但界面相对简陋,基础组件不全,框架功能相对较弱,使用不多
  • wxPython – wxWidgets的python封装接口
  • PySimpleGUI – 对tkinter, Qt, WxPython等python gui框架的进一步封装
  • PyQt – Riverbank Computing公司发布的对QT框架的python封装,GPL授权
  • PySide – QT官方发布的QT python封装,LGPL授权,可以闭源发布。 qt官方给出的Pyside和PyQt差异,除了包名、工具名外,大部分差别不大

从目前使用情况来看,PyQt使用的比较多,但PyQt是GPL授权,而PySide是LGPL授权,其功能与PyQt区别不大,但可以闭源发布。量化软件vnpy最新版使用的就是pyside6,下文主要介绍pyside6。

pyside6介绍

  1. 安装
    安装前提:Python 3.6+。使用venv或conda创建一个新的python环境。
    1
    2
    conda create -n qt python=3.8
    conda activate qt
    or
    1
    2
    python -m venv pyside
    source pyside/bin/activate
    然后使用pip安装pyside6
    1
    2
    pip install pyside6 # 安装最新版本
    pip install pyside6==6.0 # 安装6.0版本
    测试安装是否成功
    1
    2
    3
    4
    5
    >>> import PySide6.QtCore
    >>> print(PySide6.__version__)
    6.2.1
    >>> print(PySide6.QtCore.__version__)
    6.2.1
    除了pyside6 lib库安装好外,还安装了pyside6-designer、pyside6-uic、pyside6-rcc等工具。
  • pyside6-uic: 从.ui文件生成python代码,pyside6-uic -i form.ui -o ui_form.py
  • pyside6-rcc: 从.qrc文件生成python代码,pyside6-rcc -i resources.qrc -o rc_resources.py
  • pyside6-designer: Qt Designer对应的命令行程序,用于编辑/创建.ui文件
  1. hello qt程序
    将下列代码保存为hello_py.py,在终端运行python hello_py.py即可。
    1
    2
    3
    4
    5
    6
    7
    import sys
    from PySide6.QtWidgets import QApplication, QLabel

    app = QApplication(sys.argv)
    label = QLabel("Hello Qt for Python!")
    label.show()
    app.exec()
    说明:
  • QLabel是一个可以展示文本和图片的组件,文本可以是普通文本或富文本,比如html
  • QApplication app.exec()进入Qt主循环并且开始执行Qt代码
  1. 开发环境
  • vs code安装插件:Qt for Python
  • qt creator
  • pycharm配置外部工具
  1. 核心概念
  • Qt包括很多组件和模块,比如qtbase是一个包含很多模块的基础组件,它包含的module有:QtCore, QtGui, QtWidgets, QtNetwork等。所有这些module包含了很多你可以直接使用的类,比如QtCore里面包含了QFile, QTime, QByteArray等类。

  • QtWidgets是一个提供了很多预定义Widgets的模块,这些Widgets你可以添加到图形应用程序里面,包括Buttons, Labels, Boxes, Menus等。

  • QML提供了另外一种不同于Widgets的创建用户界面的方法,它首先的动机是应用于移动应用开发,但也可以在桌面应用开发中使用。QML跟Qt Quick模块一起,提供了使用点击、拖放、动画、过渡等与移动设备交互的方式。你可以在QML/Quick应用中找到的元素都聚焦于提供更现代的应用中

Qt基本模块有三部分:

  • QtCore: 提供了核心的非GUI功能,比如signal和slots,properties,序列化等
  • QtGui: 在GUI功能上扩展了QtCore的功能,比如:Events, windows and screens, OpenGL and raster-based 2D绘图,还有图片
  • QtWidgets: 提供了现成的组件,包括UI的图形元素

QML and Qt Quick使用这些模块从python跟QML语言交互

  • QtQML: 跟模块交互的基础python api
  • QtQuick: 在Qt应用中提供了类嵌入Qt Quick
  • QtQuickWidgets: 在基于widget的应用中提供了QQuickWidget类来前乳Qt Quick
  • Shiboken模块:使用python来扩展Qt/C++ 应用
  1. Qt Widgets:
  • signals and slots: 用于QObject对象之间的通信。按钮点击时,click就是信号,槽位是当按钮被点击时发生的事情,比如关闭窗口,保存文件等。类似于其他的callback回调,但回调不是很自然
  • 所有继承自QObject或它的子类的类(比如QWidget)都可以包含信号和槽位。当对象改变状态,且这个状态其他对象感兴趣时,对象可以发出信号
  • 槽位可以用于接收信号,但他们也是普通成员函数。就像一个对象不知道是否有对象接收了它的信号一样,一个槽位也不知道是否有信号连接到它了。这确保了可以用Qt来创建真正独立的组件
  • 一个槽位可以连接任意多的信号,一个信号也可以连接到任意多的槽位。连接一个信号到另外一个信号也是可能的
  • Qt widgets有许多预定义的信号和槽位,你可以创建继承自PySide6 widgets的任何类
  • Qt 自带的layout-support功能可以帮你在应用程序中组织widgets。QVBoxLayout用于垂直布局widgets,QTableWidget用于以表格形式展示信息, QTreeWidget,QTreeView用树的形式展示信息
  1. 使用ui文件
  • Qt Designer时一个图形UI设计工具,可以使用 Qt Designer基于Qt Widgets创建图形界面,它作为一个单独程序pyside6-designer或者嵌入到Qt Creator IDE。Using Qt Designer.设计存储在.ui文件中,是基于XML格式的文档. 可以使用pyside6-uic在编译时将设计转换成python/c++代码。

  • 可以使用QtUiTools模块里面的类来直接加载ui文件

  • 从Designer或QtCreator用QUiLoader和pyside6-uic使用.ui文件

  1. 其他功能
  • Using .qrc Files (pyside6-rcc) – Qt资源系统是一个可以用来在应用程序中存储二进制文件的机制,这些文件可以嵌入到应用程序并且可以被QFile类和QIcon、QPixmap类的构造函数来访问,文件名用:/来开始。最常见的使用情况时自定义的图片、图标、字体等

  • Qt Linguist和它相关的工具可以用来提供应用程序多语言的翻译功能,参考Translating Applications

  • Qt Widgets应用使用一个依赖于底层平台的默认主题。在某些情况,存在一些系统范围的配置可以用来修改Qt主题,也可以自己的widgets并为每个组件提供一个自定义的style. 参考Styling the Widgets Application

  • QML是一个声明式语言,可以让你比传统语言(c++)更快的开发应用程序。由于它的声明特性,非常适合设计应用程序的UI。在QML,一个用户界面被指定为带有属性的对象树

  • 一个PySide6/QML应用程序由至少2个不同的文件组成–一个是QML描述的用户界面文件,另外一个是用于load QML文件的python文件。QtQml和QtQuick模块提供了基于QML的UI的必要功能

  • Shiboken 擅长Qt相关的binding生成,这意味着任何Qt/C++项目可以很容易暴露给python。另外,Shiboken也提供了对于非Qt的c++项目的支持

进阶

交流

我发文章的几个地方,欢迎大家在朋友圈等地方分享,多多交流。

参考

坚持原创分享,您的支持将鼓励我继续创作更多优质内容!