一、窗口属性列表
常用属性 | 说明 |
---|---|
objectName | 窗口的唯一标识,程序通过该属性调用窗口 |
geometry | 说明属性中可以设置窗口的高度和宽度 |
window Title | 标题栏文本 |
windowIcon | 窗口的标题栏图标 |
windowOpacity | 窗口的透明度,取值范围为0~1 |
windowModality | 窗口样式,可选值有NonModal、WindowModal和ApplicationModal |
enabled | 窗口是否可用 |
mininumSize | 窗口最小化时的大小,默认为0✖0 |
maximumSize | 窗口最大化时的大小,默认值为16777215✖16777215 |
palette | 窗口的调色板,可以用来设置窗口的背景 |
font | 设置窗口的字体,包括字体的名称、大小、粗体、斜体、下划线、删除线等 |
cursor | 窗口的鼠标样式 |
contextMenuPolicy | 窗口的快捷菜单样式 |
acceptDrops | 是否接受拖放操作 |
tool Tip | 窗口的提示文本 |
toolTipDuration | 窗口提示文本的显示间隔 |
statusTip | 窗口的提示文本 |
whatsThis | 窗口的”这是什么“提示 |
layoutDirection | 窗口的布局方式,可选值有LeftToRight、RightToLeft和LayoutDirectionAuto |
autoFillBackground | 是否自动填充背景 |
styleSheet | 设置窗口样式,可以用来设置窗口的背景 |
local | 窗口的国际化设置 |
iconSize | 窗口标题栏图标的大小 |
toolButtonStyle | 窗口中的工具栏样式,默认值为ToolButtonIconOnly,表示默认只显示图标,用户可以修改为只显示文本,或同时显示图标和文本 |
dockOptions | 停靠选项 |
unifiedTitleAndToolBarOnMac | 在MacOS系统中是否可以定义标题和工具栏 |
二、窗口的个性化设置
2.1 基本属性设置
2.1.1 设置窗口的对象名称
在编写代码时,对窗口的任何设置和使用都是通过窗口的对象名称进行操作
这里默认的窗口名称为MainWindow,可以在QtDesigner的属性编辑器对其进行修改,或者在Python代码中使用setObjectName函数进行修改。
(1)属性编辑器修改
(2)Python函数修改
2.1.2 设置窗口标题栏名称
默认值为Main Window
(1)属性编辑器修改:
(2)Python修改:
预览效果:
2.1.3 修改窗口的大小
在设置窗口大小时,其值只能是整数
(1)属性编辑器修改
(2)Python修改
PyQt5窗口运行时默认居中显示在屏幕中,如果想自定义窗口的显示位置,可以根据窗口的大小和屏幕大小来进行设置。其中,窗口的大小可以使用geometry()方法即可获取,获取屏幕大小可以使用QDesktopWidget类中的screenGeometry()方法,QDesktopWidget类是PyQt5中提供的一个与屏幕相关的类,其screenGeometry()方法用来获取屏幕的大小,例如,下面代码用来获取当前屏幕的大小:
from PyQt5.QtWidgets import QDesktopWidget # 导入屏幕类
screen = QDesktopWidget().screenGeometry() # 获取屏幕大小
width = screen.width() # 获取屏幕的宽
height = screen.height() # 获取屏幕的高
2.2 更换窗口图标
在属性编辑器中设置窗口的windowIcon属性,窗口的默认图标为:
更换图标的操作流程:
这里可以看到我们的图标路径是绝对路径,如果其他用户使用这个程序将会无法正常显示,解决办法:将图标文件复制到项目同文件下,然后直接引用。
2.3 设置窗口背景
2.3.1 使用setStyleSheet()函数设置窗口背景
(1)使用setStyleSheet()函数设置窗口背景颜色
需要以 background-color【窗口背景颜色】或者border-image【窗口背景图片】的方式来进行设置。
MainWindow.setStyleSheet("#MainWindow{background-color:red}")
在使用setStyleSheet()函数设置窗口背景色之后,窗口中的控件也会继承窗口的背景色,如果想要为控件设置背景图片或图标,需要使用setPixmap()或者setIcon()函数来完成
(1)使用setStyleSheet()函数设置窗口背景图片
首先把背景图片放到.py文件同级的image文件中
MainWindow.setStyleSheet("#MainWindow{border-image:url(image/BackGround.jpeg)}")
或者
MainWindow.setStyleSheet("#MainWindow{background-image:url(image/BackGround.jpeg)}")
border-image:窗口宽高比例不合适会让图片变形👇
background-image:图片在窗口铺平,改变宽高不会让图片扭曲,只会填充对于的空白部分👇
2.3.2 使用QPalette设置窗口背景
(1)使用QPalette对象为窗口设置背景颜色:
MainWindow.setObjectName("MainWindow")
palette = QtGui.QPalette()
palette.setColor(QtGui.QPalette.Background,Qt.red)
MainWindow.setPalette(palette)
Ps:使用Qt.red时需要导入Qt模块:
from PyQt5.QtCore import Qt
(2)使用QPalette对象为窗口设置背景图片:
# ——————使用QPalette对象为窗口设置背景图片:—————— #
MainWindow.resize(720,540)
palette = QtGui.QPalette()
palette.setBrush(QtGui.QPalette.Background,QBrush(QPixmap("./image/BackGround.jpeg")))
MainWindow.setPalette(palette)
Ps: 使用Qt.red时需要导入QBrush,QPixmap模块:
from PyQt5.QtGui import QBrush,QPixmap
👆从上图可以看出来,图像没有显示完全,这是因为在使用QPalette对象为窗口设置背景图片时,默认是平铺显示的。
(3)让背景图片自动适应窗口大小:
需要在设置背景时,对setBrush()方法中的QPixmap对象参数进行设置,具体操作:在生成QPixmap窗口背景图对象参数时,使用窗口大小、QtCore.Qt.IgnoreAspectRatio值和QtCore.Qt.SmoothTransformation值进行设置:
# ——————使用QPalette对象为窗口设置背景图片(自动适应窗口大小):—————— #
MainWindow.resize(860,500)
palette = QtGui.QPalette()
palette.setBrush(QtGui.QPalette.Background,QBrush(QPixmap("./image/BackGround.jpeg").scaled(MainWindow.size(), QtCore.Qt.IgnoreAspectRatio, QtCore.Qt.SmoothTransformation)))
MainWindow.setPalette(palette)
2.3.3 通过资源文件设置窗口背景
2.3.3.1 相关步骤记录
步骤有点多我直接录屏记录
Ps:
QtDesigner-资源添加背景图
background-image:平铺
border-image:自动适应窗口大小
2.3.3.2 存在的问题
我们将.ui文件转换成.py文件以后,代码末尾会出现错误👇
解决:转换资源文件,具体如下👇
$FileName$ -o $FileNameWithoutExtension$_rc.py
$FileDir$
选中要转换的qrc文件然后在工具栏打开刚刚添加的工具
转换完成后,代码中的错误提示信息会消失
然后添加程序入口运行,就可以看到👇
2.4 控制窗口透明度
windowOpacity属性的值为0~1之间的数,其中0表示完全透明,0表示完全不透明。
(1)属性编辑器修改
(2)Python修改
MainWindow.setWindowOpacity(0.5)
2.5 设置窗口样式
相关函数:setWindowFlags(),语法👇
setWindowFlags(Qt.WindowFlags)
Qt.WindowFlags参数表示要设置的窗口样式,它的取值分为两种类型,如下表:
【PyQt5的基本窗口类型及说明】
参数值 | 说明 |
---|---|
Qt.Widget | 默认窗口,有最大化、最小化和关闭按钮 |
Qt.Window | 普通窗口,有最大化、最小化和关闭按钮 |
Qt.Dialog | 对话窗口,有问号(?)和关闭按钮 |
Qt.Popup | 无边框的弹出窗口 |
Qt.ToolTip | 无边框的提示窗口,没有任务栏 |
Qt.SplashScreen | 无边框的闪烁窗口,没有任务栏 |
Qt.SubWindow | 子窗口,窗口没有按钮,但有标题 |
示例:
MainWindow.setWindowFlags(QtCore.Qt.Dialog)
自定义顶层窗口外观及说明👇
参数值 | 说明 |
---|---|
Qt.MSWindowsFixedSizeDialogHint | 无法调整大小的窗口 |
Qt.FramelessWindowHint | 无边框窗口 |
Qt.CustomizeWindowHint | 有边框,无标题栏和按钮,不能移动和拖动窗口 |
Qt.WindowTitleHint | 添加标题栏和一个关闭按钮的窗口 |
Qt.WindowSystemMenuHint | 添加系统目录和一个关闭按钮的窗口 |
Qt.WindowMaximizeButtonHint | 激活最大化按钮的窗口 |
Qt.WindowMinimizeButtonHint | 激活最小化按钮的窗口 |
Qt.WindowMinMaxButtonHint | 激活最小化和最大化按钮的窗口 |
Qt.WindowCloseButtonHint | 添加一个关闭按钮的窗口 |
Qt.WindowContextHelpButtonHint | 添加像对话框一样的问号(?)和关闭按钮 |
Qt.WindowStaysOnTopHint | 使窗口始终处于顶层位置 |
Qt.WindowStaysOnBottomHint | 使窗口始终处于底层位置 |
示例:
MainWindow.setWindowFlags(QtCore.Qt.WindowCloseButtonHint) # 只显示关闭按钮
【注意】:对窗口样式的设置需要在初始化窗体之后才会起作用,即需要将设置窗口样式的代码放在setupUi()函数之后执行,例如:
MainWindow = QtWidgets.QMainWindow() # 创建窗体对象
ui = Ui_MainWindow() # 创建PyQt设计对象的窗体
ui.setupUi(MainWindow) # 调用PyQt窗体的方法对窗体对象进行初始化设置
MainWindow.setWindowFlags(QtCore.Qt.WindowCloseButtonHint) # 只显示关闭按钮
三、信号(signal)与槽(slot)
3.1 基本概念
信号与槽是Qt的核心机制,也是PyQt5编程时对象之间通信的基础。在PyQt5中,每一个QObject对象(包括各种窗口和控件)都支持信号与槽机制,通过信号与槽的关联,就可以实现对象之间的通信。当信号发射时,连接的槽函数(方法)将会自动执行。在PyQt5中,信号与槽是通过对象的signal.connect()方法进行连接的。
PyQt5的窗口控件中有很多内置信号,如👇
PyQt5中,信号与槽的主要特点👇:
- 一个信号可以连接多个槽。
- 一个槽可以监听多个信号。
- 信号与信号之间可以互连。
- 信号与槽的连接可以跨线程。
- 信号与槽的连接方式既可以是同步的也可以是异步的。
- 信号的参数可以是任何的Python类型。
信号与槽的连接工作示意图👇:
3.2 编辑信号与槽
eg:通过信号与槽实现一个单击按钮关闭主窗口的运行效果,具体操作步骤如下👇:
【编辑信号与槽】
Ps:
- PushButton是PyQt5中的一个命令按钮控件,在单击执行一些操作时使用
- 选中的clicked()为按钮的信号,然后选中的close()为槽函数(方法),工作逻辑是,单击按钮时发射clicked信号,该信号被主窗口的close()槽函数(方法)所捕获,并触发了关闭主窗口的行为。
- 放置按钮的代码:
self.pushButton = QtWidgets.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(130, 90, 93, 28))
self.pushButton.setObjectName("pushButton")
- 按钮显示的文本代码:
self.pushButton.setText(_translate("MainWindow", "关闭"))
完成信号与槽的关联以后,保存.ui文件并转换成.py文件,转换后实现单击按钮关闭窗口的关键代码如下:
self.pushButton.clicked.connect(MainWindow.close)
为python代码添加程序入口以后,运行一下可以看到,单击“关闭”按钮即可关闭窗口。
3.3 自定义槽
自定义槽本质上就是自定义一个函数,该函数来实现相应的功能。
示例:
自定义一个槽函数,用来单击按钮时,弹出一个“Hello”的信息提示框。代码如下👇:
def showMessage(self):
from PyQt5.QtWidgets import QMessageBox # 导入QMessageBox类
# 使用information()方法弹出信息提示框
QMessageBox.information(MainWindow,"提示框","Hello",QMessageBox.Yes | QMessageBox.No,QMessageBox.Yes)
3.4 将自定义槽连接到信号
# 将自定义槽连接到信号
self.pushButton.clicked.connect(self.showMessage)
四、多窗口设计
示例: 创建并打开多窗口
4.1 多窗口的建立
先多新建几个窗口,如图👇
在QtDesigner设计器中添加多个窗口后,在保存时,需要分别将鼠标焦点定位到要保存的窗口上,单独为每个窗口进行保存操作;而在将.ui文件转换为.py文件时,也需要分别选中每个.ui文件,单独进行转换。
4.2 设置启动窗口
把.ui文件都转为.py,并在python文件中添加程序入口
4.3 窗口之间的关联
在多窗口创建完成后,需要将各个窗口进行关联,然后才能形成一个完整的项目
将untitled1、untitled2、untitled3、untitled4中的
class Ui_Dialog(object):
改为:
然后在主窗口文件中定义一个槽函数,用来使用QMainWindow对象的show()方法打开四个窗口
def open(self):
from example002 import untitled1, untitled2, untitled3, untitled4
self.second = untitled1.Ui_MainWindow() # 创建第2个窗体对象
self.second.show() # 显示窗体
self.third = untitled2.Ui_MainWindow() # 创建第3个窗体对象
self.third.show() # 显示窗体
self.forth = untitled3.Ui_MainWindow() # 创建第4个窗体对象
self.forth.show() # 显示窗体
self.fifth = untitled4.Ui_MainWindow() # 创建第5个窗体对象
self.fifth.show() # 显示窗体
然后将按钮的clicked()信号与刚才定义的槽函数open()相关联:
self.pushButton.clicked.connect(self.open) # 关联自定义槽函数