Skip to content

Pyside6

前言

PyQt6采用GPLv3和商业许可证:

  • GPLv3:如果你的项目遵循 GPLv3(完全开源),那么 PyQt6 是免费的。
  • 商业许可证:如果你的代码是闭源的,并用于商业目的,则需要向 Riverbank Computing 购买许可证。

PySide6采用LGPLv3,允许在闭源项目中使用和商用,但必须以动态链接库的形式使用PySide6,不能直接修改PySide6的代码。用Pyside6的官方工具打包项目的时候,会自动打包成动态库,所以完全可以放心使用!

文件类型

文件类型描述
.uiUI编辑器
.qrc资源收集文件
.qmlQT建模语言

组件化

使用QtDesigner生成的ui转为py类之后,setupUi中初始化的是这个窗体类里面的控件,没有包含窗体本身,有2种方式添加到其他控件中:

第一种方式:

注意:如果代码有问题,虽然布局能出来但会导致一些信号和槽失效。

python
# 根据ui生成的类
class Ui_StackedWidget:
    def setupUi(self, StackedWidget):
    	pass


class MyMainWindow(QWidget):
	def __init__(self):
        super().__init__()
        layout = QVBoxLayout(self)
        
        qsw = QStackedWidget(self)
        sw = Ui_StackedWidget()
        sw.setupUi(qsw)
        
        layout.addWidget(qsw)

第二种方式(推荐):

python
# 根据ui生成的类,手动添加继承关系和初始化函数
class Ui_StackedWidget(QStackedWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setupUi(self)
	
    def setupUi(self, StackedWidget):
    	pass


class MyMainWindow(QWidget):
	def __init__(self):
        super().__init__()
        layout = QVBoxLayout(self)
        
        sw = Ui_StackedWidget(self)
        
        layout.addWidget(sw)

窗口

基础窗口类

基础窗口类描述能否内嵌
QWidget所有窗口类和控件的基类可内嵌,也可作为独立窗口显示
QDialog对话框窗口类
QMainWindow主窗口类,可以包含菜单栏、工具栏、状态栏等

窗口布局

窗口布局就类似CSS中的弹性布局,通过坐标指定控件的位置是固定的,在窗口缩放时会有问题。常用的布局方式有三种:水平布局垂直布局网格(栅格)布局。表单布局不常用(事实上,也不太好用)。

一般给窗口布局是无限嵌套的:比如给主窗口设置布局,在布局中添加子窗口,再给子窗口布局,在子窗口布局中再次添加子窗口,如此无限嵌套循环,就可以灵活设计出更多复杂的界面。

布局属性

网格布局水平布局垂直布局描述
layoutLeftMargin左边距
layoutTopMargin上边距
layoutRightMargin右边距
layoutBottomMargin下边距
layoutHorizontalSpacinglayoutSpacing水平方向控件之间的间距
layoutVerticalSpacinglayoutSpacing垂直方向控件之间的间距
layoutRowStretchlayoutStretch垂直方向拉伸行的高度
layoutColumnStretchlayoutStretch水平方向拉伸列的宽度
layoutRowMinimumHeight设置指定行的最小高度
layoutColumnMinimumWidth设置指定列的最小宽度
layoutSizeConstraint布局尺寸约束
边距和间距
伸缩因子

伸缩因子用于控制布局中子控件或子布局在剩余空间中的分配比例。默认为0,均分空间。

在UI设计器中,伸缩因子的值是一个类似数组格式的文本,数组长度就是行数(或列数),其索引对应行(或列),其值对应伸缩比例。比如网格布局的layoutRowStretch值为"1,0,2",在代码中就是:

python
gridLayout.setRowStretch(0, 1)  # 索引为0,第1行的伸缩因子为1
gridLayout.setRowStretch(2, 2)  # 索引为2,第3行的伸缩因子为2

提示

如果UI设计器的伸缩因子的数组长度和行(或列)数不符合,可以重启UI设计器。

最小尺寸约束

网格布局中的layoutRowMinimumHeightlayoutColumnMinimumWidth用于设置行/列的最小尺寸约束,确保布局中的行高或列宽不会因为内容变化或窗口缩放而小于指定值。

python
gridLayout.setRowMinimumHeight(0, 50)  # 设置第1行的最小高度为50px
gridLayout.setColumnMinimumWidth(1, 200)  # 设置第2列的最小宽度为200px
布局尺寸约束

layoutSizeConstraint用于控制布局本身的最小或最大尺寸如何影响父窗口或父容器的尺寸,它决定了布局与父容器之间的尺寸约束关系。

可选项描述
SetDefaultConstraint
SetNoConstraint
SetMinimumSize
SetFixedSize
SetMaximumSize
SetMinAndMaxSize

间隔器【弹簧】

顾名思义,Spacer是产生间距的控件,它可以调整控件的位置,使其靠左、靠右、居中等,也可以调整控件之间的距离。

不使用弹簧的界面: 下面使用水平弹簧(Expanding)让按钮btn1btn2靠右,使用垂直弹簧(Fixed)让按钮btn4btn5之间产生固定的距离:

sizeType属性可选项描述
Fixed弹簧大小固定,可设置sizeHint属性来调整弹簧宽高以产生固定的间距
Minimum弹簧收缩到sizeHint后不能再收缩,相当于设置了一个弹簧的最小尺寸
Maximum弹簧伸展到sizeHint后不能再伸展,相当于设置了一个弹簧的最大尺寸
Preferred以合适大小显示,可以收缩或扩展
Expanding尽可能扩充可用空间
MinimumExpanding结合Minimum和Expanding,尽可能扩充可用空间且弹簧有最小尺寸
Ignored忽略弹簧大小,可以收缩或扩展

信号和槽

简单理解就是一种发布-订阅模式。信号的本质是事件,槽的本质是回调函数。当事件发生时,连接(通过connect函数)了该事件的所有回调函数都会被自动调用。QT本身有很多标准信号和槽,同时我们也可以自定义信号和槽。

  1. 一个信号可以连接多个槽函数,一个槽函数可以连接多个信号。(多对多的关系)
  2. 信号可以连接信号。
  3. 信号和槽可以断开。

线程

部署

打包为一个exe文件运行会有一个控制台窗口,需要在pysidedeploy.spec中添加参数:

[nuitka]
extra_args = --windows-console-mode=disable

警告:找不到dumpbin.exe

这个文件如果安装了VS一般会自带,但除非正确设置环境(通常你改变了VS的安装路径就不正确了),否则无法从系统命令提示符启动 DUMPBIN,只能通过VS里面的命令行使用。默认安装路径为to_you_path\VC\Tools\MSVC\14.38.33130\bin\Hostx64\x64,只需要把这个路径添加到环境变量即可。