Python GUI设计——PyQt5的学习实践记录day03(PyQt窗口设计基础)

一、窗口属性列表

常用属性说明
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:

  1. PushButton是PyQt5中的一个命令按钮控件,在单击执行一些操作时使用
  2. 选中的clicked()为按钮的信号,然后选中的close()为槽函数(方法),工作逻辑是,单击按钮时发射clicked信号,该信号被主窗口的close()槽函数(方法)所捕获,并触发了关闭主窗口的行为。
  3. 放置按钮的代码:
		self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(130, 90, 93, 28))
        self.pushButton.setObjectName("pushButton")

在这里插入图片描述

  1. 按钮显示的文本代码:
 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)  # 关联自定义槽函数
  • 14
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IRUIRUI__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值