引言
pyqt5 是一个用于创建图形用户界面的 python 绑定库,它基于 qt5 应用程序框架。在 pyqt5 中,qpushbutton
是一个常用的控件,用于创建按钮,允许用户通过点击来触发某些操作。
用来给用户点击, 来完成某种动作的控件,一般是矩形的
应用场景
例如:登录按钮,注册按钮,关闭按钮,一些选择按钮等等等
qpushbutton继承于qabstractbutton,所以具有abstractbutton的一切特性,而且qpushbutton还包含自己特有的一些功能。
本文将详细介绍 qpushbutton
的用法,并通过实际案例来展示其强大的功能。
1. qpushbutton 控件基础
1.1 描述
qpushbutton
控件是一个矩形按钮,通常用于执行如登录、注册、关闭等操作。用户可以通过点击按钮来触发一个事件或操作。
1.2 继承关系
qpushbutton
控件继承自 qabstractbutton
类,这意味着它拥有 qabstractbutton
的所有功能,并增加了自己的特性。
1.3 初始化函数
qpushbutton
的初始化函数可以接收多个参数,具体取决于你想如何配置按钮。最常见的用法包括:
qpushbutton()
:创建一个无父控件和文本的按钮。qpushbutton(parent)
:创建控件的同时,设置父控件。qpushbutton(text, parent)
:创建控件的同时,设置提示文本和父控件。qpushbutton(icon, text, parent)
:创建控件的同时,设置图标、提示文本和父控件。
2. qpushbutton 的常用功能
2.1 创建按钮
按钮可以显示文本和图标。使用 settext()
方法设置文本,使用 seticon()
和 seticonsize()
方法设置图标及其大小。
from pyqt5.qtwidgets import qapplication, qwidget, qpushbutton from pyqt5.qtgui import qicon app = qapplication([]) window = qwidget() window.setwindowtitle('qpushbutton 示例') btn = qpushbutton(window) btn.settext('点击我') icon = qicon('icon.png') btn.seticon(icon) btn.seticonsize(qsize(30, 30)) # 假设需要导入qsize btn.show() window.show() app.exec_()
代码展示:
# 0. 导入需要的包和模块 from pyqt5.qt import * # 主要包含了我们常用的一些类, 汇总到了一块 import sys # 1. 创建一个应用程序对象 app = qapplication(sys.argv) # 2. 控件的操作 # 2.1 创建控件 window = qwidget() # 2.2 设置控件 #设置窗口标题,默认标题是python,只有顶级控件才可以设置标题栏的标题 window.setwindowtitle("qpushbutton创建") #设置窗口大小,注意,设置的空间尺寸大小,不包含上面的标题栏 window.resize(500, 500) #创建按钮 #创建方式一,指定活不指定父控件 btn = qpushbutton(window) btn.settext("按钮1") #创建方式二,创建按钮的同时,设置提示文本和父控件 btn2 = qpushbutton('按钮2',window) btn2.move(50,50) #创建方式三,创建控件的同时, 设置图标, 提示文本和父控件 btn3 = qpushbutton(qicon("../../imgs/python-gui.png"),'按钮3',window) btn3.move(100,100) # 2.3 展示控件 window.show() # 3. 应用程序的执行, 进入到消息循环 sys.exit(app.exec_())
运行可见,三种创建方式都可以
2.2 启用和禁用
可以使用 setenabled()
方法启用或禁用按钮。禁用的按钮不会响应用户的点击操作。
btn.setenabled(false) # 禁用按钮
2.3 设置快捷键
qpushbutton
支持设置快捷键,允许用户通过键盘操作来触发按钮的点击事件。使用 setshortcut()
方法设置快捷键。
btn.setshortcut('ctrl+q') # 设置快捷键为 ctrl+q
这个与其父类qabdtractbutton用法一样,略
2.4 菜单设置
当我们鼠标,点击按钮之后,可以展开一系列的下拉菜单供我们选择
当我们创建菜单之后,用户点击按钮,就会展示相关菜单
api介绍
showmenu()指的是我们程序员可以通过代码来控制按钮来展示菜单
当我们把鼠标放在某菜单上面,会显示出第二列,甚至第三列的菜单称为子菜单
qmenu相关操作
代码展示:
# 0. 导入需要的包和模块 from pyqt5.qt import * # 主要包含了我们常用的一些类, 汇总到了一块 import sys # 1. 创建一个应用程序对象 app = qapplication(sys.argv) # 2. 控件的操作 # 2.1 创建控件 window = qwidget() # 2.2 设置控件 #设置窗口标题,默认标题是python,只有顶级控件才可以设置标题栏的标题 window.setwindowtitle("菜单创建") #设置窗口大小,注意,设置的空间尺寸大小,不包含上面的标题栏 window.resize(500, 500) #创建按钮 btn = qpushbutton(window) btn.settext("按钮1") #创建菜单 menu = qmenu(window) #将菜单放到按钮上,此时按钮就会出现一个下拉箭头 btn.setmenu(menu) # 子菜单 最近打开 # open_recent_menu = qmenu(menu) #设置子菜单标题 # open_recent_menu.settitle("最近打开") #一次性写全,创建子菜单 #qmenu(title: optional[str], parent: optional[qwidget] = none) open_recent_menu = qmenu("最近打开",menu) # 行为动作 新建 打开 分割线 退出 # new_action = qaction() # new_action.settext("新建") # new_action.seticon(qicon("../../imgs/python-gui.png")) #新建,一次性写全创建动作 #qaction(icon: qicon, text: optional[str], parent: optional[qobject] = none) new_action = qaction(qicon("../../imgs/python-gui.png"), "新建", menu) #通过信号来执行相应的槽函数 new_action.triggered.connect(lambda: print("新建文件")) #打开 open_action = qaction(qicon("xxx.png"), "打开", menu) open_action.triggered.connect(lambda: print("打开文件")) #退出程序 exit_action = qaction("退出", menu) # exit_action.triggered.connect(lambda: print("退出程序")) exit_action.triggered.connect(lambda: window.close()) #子菜单动作 file_action = qaction("python-gui编程-pyqt5") file_action.triggered.connect(lambda :print("python-gui编程-pyqt5")) #将动作添加到菜单上,点击菜单执行相应动作 menu.addaction(new_action) menu.addaction(open_action) #子菜单添加动作 open_recent_menu.addaction(file_action) #添加子菜单 menu.addmenu(open_recent_menu) #添加分割线 menu.addseparator() menu.addaction(exit_action) # 2.3 展示控件 window.show() #展示菜单,相当于用户点击了按钮的菜单按钮 #展示菜单的代码一定要在主窗口展示之后,否则展示不到 # btn.showmenu() #获取菜单 print(btn.menu()) # 3. 应用程序的执行, 进入到消息循环 sys.exit(app.exec_())
点击下拉菜单
点击新建,会触发信号
2.4 边框是否扁平
qpushbutton
支持设置边框是否扁平。扁平化的按钮在某些样式下可能不绘制背景,只显示文本或图标。使用 setflat()
方法设置此属性。
设置了按钮扁平化之后,给按钮设置的背景颜色等样式,都不在生效
代码展示:
# 0. 导入需要的包和模块 from pyqt5.qt import * # 主要包含了我们常用的一些类, 汇总到了一块 import sys # 1. 创建一个应用程序对象 app = qapplication(sys.argv) # 2. 控件的操作 # 2.1 创建控件 window = qwidget() # 2.2 设置控件 #设置窗口标题,默认标题是python,只有顶级控件才可以设置标题栏的标题 window.setwindowtitle("按钮扁平化") #设置窗口大小,注意,设置的空间尺寸大小,不包含上面的标题栏 window.resize(500, 500) #创建按钮,默认按钮是凸出来的 btn = qpushbutton(window) btn.settext("按钮") #查看默认情况下,按钮是否扁平化 # print(btn.isflat()) #false #给按钮设置背景颜色 btn.setstylesheet("background-color: red;") #设置按钮扁平化 btn.setflat(true) #再次查看按钮是否扁平化 print(btn.isflat()) #true # 2.3 展示控件 window.show() # 3. 应用程序的执行, 进入到消息循环 sys.exit(app.exec_())
设置扁平化之前,按钮有凸起
设置扁平化
btn.setflat(true)
按钮不再有凸起,而是与周边样式一样
当点下按钮,才能看到按钮样式
而且设置扁平化之后,给按钮设置的背景颜色等样式也不再生效
未设置扁平化之前,按钮背景颜色设为了红色,且显示红色
设置扁平化之后,按钮背景颜色不再显示
只有点下时,才显示
2.5 信号和槽
qpushbutton
的主要事件是 clicked
,即按钮被点击时触发。可以通过 clicked.connect()
方法将 clicked
信号连接到自定义的槽函数。
def on_click(): print('按钮被点击了') btn.clicked.connect(on_click)
2.6 默认按钮处理
主要应用场景在 弹出对话框时,默认光标所在的按钮
例如如下所示,当我们点击打开文件按钮,会弹出一个对话框,此时鼠标光标会默认落在 打开 这个按钮上
默认按钮处理有自动默认处理和设置默认
自动默认按钮,指的是当用户点击该按钮,该按钮就自动的会被选中为默认的
setdefault()是直接设置该按钮为默认按钮
默认情况下,我们点击按钮,松开后会恢复原样
代码展示:
# 0. 导入需要的包和模块 from pyqt5.qt import * # 主要包含了我们常用的一些类, 汇总到了一块 import sys # 1. 创建一个应用程序对象 app = qapplication(sys.argv) # 2. 控件的操作 # 2.1 创建控件 window = qwidget() # 2.2 设置控件 #设置窗口标题,默认标题是python,只有顶级控件才可以设置标题栏的标题 window.setwindowtitle("默认按钮") #设置窗口大小,注意,设置的空间尺寸大小,不包含上面的标题栏 window.resize(500, 500) btn = qpushbutton(window) btn.settext("按钮1") btn2 = qpushbutton(window) btn2.settext("btn2") btn2.move(100, 100) # 2.3 展示控件 window.show() # 3. 应用程序的执行, 进入到消息循环 sys.exit(app.exec_())
当我们设置为自动默认按钮后,用户再点击该按钮,即便释放后,该按钮也会处于被选中状态
btn2.setautodefault(true) #查看按钮是否设置了自动默认按钮 print(btn.autodefault()) print(btn2.autodefault())
当我们点击btn2,btn2就会处于被选中状态
由下列的打印也可得知,btn2设置了自动默认按钮
setautodefault() 是用户点击了,才设置为自动默认
如果想要一开始就是默认按钮,则使用setdefault()
#设置默认按钮 btn2.setdefault(true) #查看是够设置了默认按钮 print(btn.isdefault()) print(btn2.isdefault())
此时,运行程序,btn2就设置了默认按钮,处于被选中状态
2.7 右键菜单
用户用鼠标右键点击窗口后,弹出来的菜单
右键菜单实际上是通过发射信号来实现的
qpushbutton的信号都是继承自父类的
右键菜单实现的方式有两种
方法一
也是默认的,window.setcontextmenupolicy(qt.defaultcontextmenu)
当我们在pyqt5组件上右键点击窗体时会触发一个事件:contextmenuevent,
默认情况下,window.setcontextmenupolicy()里面的是参数是qt.defaultcontextmenu,鼠标右键执行的是contextmenuevent
我们要想自己设计右键点击后弹出的事件,我们就必须要重载contextmenuevent这个方法。
代码展示:
# 0. 导入需要的包和模块 from pyqt5.qt import * # 主要包含了我们常用的一些类, 汇总到了一块 import sys #重写个窗口类,继承qwidget,重写contextmenuevent方法 class window(qwidget): # 重写contextmenuevent方法,然后在该窗口下只要鼠标右键,就会触发该方法,执行该方法中的逻辑 def contextmenuevent(self, evt): print("在窗口中右键点击鼠标") # 1. 创建一个应用程序对象 app = qapplication(sys.argv) # 2. 控件的操作 # 2.1 创建控件 window = window() # 2.2 设置控件 #设置窗口标题,默认标题是python,只有顶级控件才可以设置标题栏的标题 window.setwindowtitle("右键菜单") #设置窗口大小,注意,设置的空间尺寸大小,不包含上面的标题栏 window.resize(500, 500) # 2.3 展示控件 window.show() # 3. 应用程序的执行, 进入到消息循环 sys.exit(app.exec_())
鼠标右键
右击展示菜单代码
# 0. 导入需要的包和模块 from pyqt5.qt import * # 主要包含了我们常用的一些类, 汇总到了一块 import sys #重写个窗口类,继承qwidget,重写contextmenuevent方法 class window(qwidget): # 重写contextmenuevent方法,然后在该窗口下只要鼠标右键,就会触发该方法,执行该方法中的逻辑 # qcontextmenuevent def contextmenuevent(self, evt): # print("在窗口中右键点击鼠标") # 创建菜单 menu = qmenu(window) # 子菜单 最近打开 # open_recent_menu = qmenu(menu) # 设置子菜单标题 # open_recent_menu.settitle("最近打开") # 一次性写全,创建子菜单 # qmenu(title: optional[str], parent: optional[qwidget] = none) open_recent_menu = qmenu("最近打开", menu) # 行为动作 新建 打开 分割线 退出 # new_action = qaction() # new_action.settext("新建") # new_action.seticon(qicon("../../imgs/python-gui.png")) # 新建,一次性写全创建动作 # qaction(icon: qicon, text: optional[str], parent: optional[qobject] = none) new_action = qaction(qicon("../../imgs/python-gui.png"), "新建", menu) # 通过信号来执行相应的槽函数 new_action.triggered.connect(lambda: print("新建文件")) # 打开 open_action = qaction(qicon("xxx.png"), "打开", menu) open_action.triggered.connect(lambda: print("打开文件")) # 退出程序 exit_action = qaction("退出", menu) # exit_action.triggered.connect(lambda: print("退出程序")) exit_action.triggered.connect(lambda: window.close()) # 子菜单动作 file_action = qaction("python-gui编程-pyqt5") file_action.triggered.connect(lambda: print("python-gui编程-pyqt5")) # 将动作添加到菜单上,点击菜单执行相应动作 menu.addaction(new_action) menu.addaction(open_action) # 子菜单添加动作 open_recent_menu.addaction(file_action) # 添加子菜单 menu.addmenu(open_recent_menu) # 添加分割线 menu.addseparator() menu.addaction(exit_action) #展示菜单用exec_()方法,执行的时候传递qpoint对象,是哪个点的位置 #默认菜单会在(0,0)位置展示 # 我们设置在鼠标点击的位置显示菜单,evt.globalpos()获取鼠标右击点的位置 #必须是相对于全局的坐标,不能是相对于窗口的坐标 menu.exec_(evt.globalpos()) # 1. 创建一个应用程序对象 app = qapplication(sys.argv) # 2. 控件的操作 # 2.1 创建控件 window = window() # 2.2 设置控件 #设置窗口标题,默认标题是python,只有顶级控件才可以设置标题栏的标题 window.setwindowtitle("右键菜单") #设置窗口大小,注意,设置的空间尺寸大小,不包含上面的标题栏 window.resize(500, 500) # 2.3 展示控件 window.show() # 3. 应用程序的执行, 进入到消息循环 sys.exit(app.exec_())
方法二
window.setcontextmenupolicy(qt.customcontextmenu)
需要自定义个槽函数,根据信号触发
代码展示
# 0. 导入需要的包和模块 from pyqt5.qt import * # 主要包含了我们常用的一些类, 汇总到了一块 import sys # 1. 创建一个应用程序对象 app = qapplication(sys.argv) # 2. 控件的操作 # 2.1 创建控件 window = qwidget() # 2.2 设置控件 #设置窗口标题,默认标题是python,只有顶级控件才可以设置标题栏的标题 window.setwindowtitle("右键菜单方式二") #设置窗口大小,注意,设置的空间尺寸大小,不包含上面的标题栏 window.resize(500, 500) #自定义个方法,来创建菜单,形参接收一个相对于窗口的位置坐标qpoint对象 def show_menu(point): print(point) # 创建菜单 menu = qmenu(window) # 子菜单 最近打开 # open_recent_menu = qmenu(menu) # 设置子菜单标题 # open_recent_menu.settitle("最近打开") # 一次性写全,创建子菜单 # qmenu(title: optional[str], parent: optional[qwidget] = none) open_recent_menu = qmenu("最近打开", menu) # 行为动作 新建 打开 分割线 退出 # new_action = qaction() # new_action.settext("新建") # new_action.seticon(qicon("../../imgs/python-gui.png")) # 新建,一次性写全创建动作 # qaction(icon: qicon, text: optional[str], parent: optional[qobject] = none) new_action = qaction(qicon("../../imgs/python-gui.png"), "新建", menu) # 通过信号来执行相应的槽函数 new_action.triggered.connect(lambda: print("新建文件")) # 打开 open_action = qaction(qicon("xxx.png"), "打开", menu) open_action.triggered.connect(lambda: print("打开文件")) # 退出程序 exit_action = qaction("退出", menu) # exit_action.triggered.connect(lambda: print("退出程序")) exit_action.triggered.connect(lambda: window.close()) # 子菜单动作 file_action = qaction("python-gui编程-pyqt5") file_action.triggered.connect(lambda: print("python-gui编程-pyqt5")) # 将动作添加到菜单上,点击菜单执行相应动作 menu.addaction(new_action) menu.addaction(open_action) # 子菜单添加动作 open_recent_menu.addaction(file_action) # 添加子菜单 menu.addmenu(open_recent_menu) # 添加分割线 menu.addseparator() menu.addaction(exit_action) # 展示菜单用exec_()方法 # 默认菜单会在(0,0)位置展示 #方法中的参数point可以获取鼠标右键点击相对于窗口的局部坐标 #window.maptoglobal将point局部坐标转换为全局坐标点 # 将point局部坐标点,映射为相对于桌面的全局坐标点坐标 dest_point = window.maptoglobal(point) menu.exec_(dest_point) #自定义右键菜单,通过发射信号方式来触发,先将菜单上下文策略设为自定义模式 window.setcontextmenupolicy(qt.customcontextmenu) #根据定义的槽函数发射信号 window.customcontextmenurequested.connect(show_menu) # 2.3 展示控件 window.show() # 3. 应用程序的执行, 进入到消息循环 sys.exit(app.exec_())
鼠标在窗口上右键,弹出菜单
当然,我们可以继续深入讨论 pyqt5 中 qpushbutton
的高级用法以及如何在更复杂的应用场景中使用它。以下是一些扩展话题和示例:
3. 按钮样式定制
pyqt5 允许你通过样式表(qss,类似于 css)来自定义按钮的外观。这包括改变按钮的背景色、边框、字体等。
from pyqt5.qtwidgets import qapplication, qwidget, qpushbutton app = qapplication([]) window = qwidget() btn = qpushbutton('定制样式', window) btn.setstylesheet(""" qpushbutton { background-color: #4caf50; color: white; border: 2px solid #3e8e41; border-radius: 10px; padding: 10px; font-size: 16px; min-width: 100px; } qpushbutton:hover { background-color: #45a049; } qpushbutton:pressed { background-color: #388e3c; } """) btn.show() window.show() app.exec_()
在这个例子中,我们为按钮设置了基本的样式,包括背景色、文字颜色、边框、边框圆角、内边距、字体大小和最小宽度。同时,我们还定义了鼠标悬停和按钮按下时的样式变化。
4. 按钮的动画效果
虽然 pyqt5 本身不直接支持复杂的动画效果,但你可以使用 qpropertyanimation
来为按钮添加简单的动画,如淡入淡出、大小变化等。
from pyqt5.qtwidgets import qapplication, qwidget, qpushbutton from pyqt5.qtcore import qpropertyanimation, qrect, qpoint app = qapplication([]) window = qwidget() btn = qpushbutton('动画效果', window) btn.setgeometry(50, 50, 100, 40) # 创建一个动画对象,用于改变按钮的几何形状 animation = qpropertyanimation(btn, b"geometry") animation.setduration(1000) # 持续时间1000毫秒 animation.setstartvalue(qrect(50, 50, 100, 40)) animation.setendvalue(qrect(150, 50, 100, 40)) # 移动到新的位置 animation.start() # 开始动画 btn.show() window.show() app.exec_()
在这个例子中,我们创建了一个动画,使按钮在屏幕上水平移动。注意,这里使用了 qpropertyanimation
的 b"geometry"
属性来指定要改变的属性。
5. 按钮的分组和禁用
在某些情况下,你可能需要将多个按钮组合在一起,并允许用户一次只能激活其中一个。虽然 pyqt5 没有直接提供按钮组的控件,但你可以通过编程方式实现这一功能。
此外,如果你需要禁用一组按钮中的某些按钮,可以遍历这些按钮并调用它们的 setenabled(false)
方法。
6. 按钮的自定义行为
除了基本的点击事件外,你还可以为按钮添加其他类型的事件处理逻辑,如双击事件、长按事件等。虽然 pyqt5 的 qpushbutton
不直接支持双击和长按事件,但你可以通过重写按钮的某些方法或使用定时器来模拟这些行为。
7. 实际应用中的按钮设计
在开发实际应用程序时,按钮的设计应该符合应用程序的整体风格和用户体验。这包括按钮的大小、颜色、位置、文本内容以及图标的选择。同时,按钮的响应速度和反馈也是非常重要的,用户应该能够清楚地知道他们的操作是否被系统识别和处理。
总结
qpushbutton
是 pyqt5 中一个非常强大且灵活的控件,它允许你创建各种类型的按钮来满足不同的需求。通过本文的介绍,你应该已经掌握了 qpushbutton
的基本用法和高级功能,并能够在实际应用中灵活运用它。随着你对 pyqt5 的进一步学习,你会发现更多关于按钮和其他控件的有趣用法和技巧。
以上就是pyqt5中qpushbutton的用法详细解析与应用实战的详细内容,更多关于pyqt5 qpushbutton用法的资料请关注代码网其它相关文章!
发表评论