QAbstractButton
绘制子类化抽象类(自定义按钮)
QAbstractButton 是所有按钮控件的父类,如果单独创建该抽象类,其中并没有任何数值,也没有默认值。如果我们想要自定义一个按钮,这就是很好的方法。
| API |
作用 |
| huajia = QPainter(self) |
创建绘画者 |
| QPen(QColor(10,100,100),10) |
创建画笔 |
| huajia.setPen(pen) |
设置画笔给画家 |
| huajia.drawText(25,40,self.text()) |
绘画一个文本控件 |
| huajia.drawEllipse(0,0,100,100) |
设置绘画的图形 |
import sysfrom PyQt5.Qt import *app = QApplication(sys.argv)window = QWidget()window.setWindowTitle("芜湖")window.resize(500,500)class Btn1(QAbstractButton): #重写控件 def paintEvent(self, evt): #重写绘画时间 huajia = QPainter(self) #创建 绘画者 pen = QPen(QColor(10,100,100),10) #创建 画笔 RGB 控件大小 huajia.setPen(pen) #设置 画笔 huajia.drawText(25,40,self.text()) #绘画一个文本控件 X Y 绘画文本变量 huajia.drawEllipse(0,0,100,100) #设置绘画图形 btn = Btn1(window) #调用控件 btn.setText("123") #设置文本 btn.resize(100,100) #设置大小 btn.pressed.connect(lambda : print("点击了一下")) #绑定事件 window.show()sys.exit(app.exec_())
文本设置
import sysfrom PyQt5.Qt import *app = QApplication(sys.argv)window = QWidget()window.setWindowTitle("Test")window.resize(500,500)btn = QPushButton(window)btn.setText("1") #设置文本def plus_one(): x = int(btn.text()) + 1 #btn.text 获取文本 btn.setText(str(x))btn.pressed.connect(plus_one)window.show()sys.exit(app.exec_())
图标设置/按钮添加图片
| API |
作用 |
| icon = QIcon(“../qe.jpg”) |
设置图片文件位置 |
| btn.setIcon(icon) |
设置按钮要添加的图片 |
| size = QSize(80,80) |
设置图片文件的大小参数 |
| btn.setIconSize(size) |
设置按钮的大小 |
import sysfrom PyQt5.Qt import *app = QApplication(sys.argv)window = QWidget()window.setWindowTitle("Test")window.resize(500,500)btn = QPushButton(window)btn.resize(200,90)icon = QIcon("../qe.jpg")btn.setIcon(icon)size = QSize(80,80)btn.setIconSize(size)window.show()sys.exit(app.exec_())
快捷键设置
| API |
作用 |
| btn.setShortcut(“Alt+y”) |
自定义快捷键 |
| btn1.setText(“a&bc”) |
给字符串加上& 函数自动配置快捷键 |
import sysfrom PyQt5.Qt import *app = QApplication(sys.argv)window = QWidget()window.setWindowTitle("社会我奥哥~~~")window.resize(500,500)btn = QPushButton(window)btn.setText("1")btn.setShortcut("Alt+y") #自定义快捷键btn1 = QPushButton(window)btn1.setText("a&bc") #让函数帮忙设置快捷键btn.move(100,100)btn1.pressed.connect(lambda : print("abc 我被点击了"))window.show()sys.exit(app.exec_())
自动重复
| API |
作用 |
| setAutoRepeat(bool) |
设置自动重复 |
| setAutoRepeatInterval() |
设置自动重复检测间隔 |
| setAutoRepeatDelay() |
设置初次检测延迟 |
| autoRepeat() |
获取是否自动重复 |
| autoRepeatInterval() |
获取自动重复检测间隔 |
| autoRepeatDelay() |
获取初次检测延迟 |
不松开鼠标重复执行函数 当用户点击按钮后, 想快速重复性响应时设置
import sysfrom PyQt5.Qt import *app = QApplication(sys.argv)window = QWidget()window.setWindowTitle("社会我奥哥~~~")window.resize(500,500)btn1 = QPushButton(window)btn1.setText("1")btn1.move(100,100)btn1.setAutoRepeat(True) #设置自动重复btn1.setAutoRepeatDelay(100) #设置初次检测延迟btn1.setAutoRepeatInterval(100) #设置初次自动重复检测延迟def onclick_ed(): x = int(btn1.text()) + 1 btn1.setText(str(x))btn1.pressed.connect(onclick_ed)window.show()sys.exit(app.exec_())
状态设置
判定按钮的状态
| API |
作用 |
| isDown() |
是否按下按钮 |
| setDown(bool) |
设置按钮, 是否被按下 |
| isChecked() |
是否选中了按钮 |
| isCheckable() |
按钮是否可以被选中 |
| setCheckable(bool) |
设置按钮, 是否可以被选中 |
| setChecked(bool) |
设置按钮, 是否被选中 |
| toggle() |
切换选中与非选中状态 |
| isEnabled() |
是否为开启 |
| setEnabled(bool) |
设置是否为开启 |
import sysfrom PyQt5.Qt import *app = QApplication(sys.argv)window = QWidget()window.setWindowTitle("社会我奥哥~~~")window.resize(500,500)push_button = QPushButton(window) #创建三个按钮push_button.setText("点我按下")push_button.move(100,100)radio_b = QRadioButton(window) #创建三个按钮radio_b.setText("点我选择")radio_b.move(100,200)check_b = QCheckBox(window) #创建三个按钮check_b.setText("点我多选")check_b.move(100,300)btn1 = QPushButton(window)btn1.setText("点击更换")push_button.setDown(True) #设置按下状态check_b.setDown(True)radio_b.setDown(True)push_button.setCheckable(True) #设置普通按钮也能被选中print(push_button.isCheckable()) #打印选中状态print(check_b.isCheckable())print(radio_b.isCheckable())push_button.setChecked(True) #设置为选中状态radio_b.setChecked(True) check_b.setChecked(True)def changes(): push_button.toggle() #切换为选中与非选中状态 radio_b.toggle() check_b.toggle()btn1.pressed.connect(changes)print(push_button.isEnabled())window.show()sys.exit(app.exec_())
排他性
设置组件中的一些按钮,只能单选。
如果同时存在多个按钮, 而此时所有按钮又设置了排他性,则在同一时刻只能选中一个按钮
| API |
作用 |
| autoExclusive() |
是否自动排他 |
| setAutoExclusive(bool) |
设置自动排他 |
import sysfrom PyQt5.Qt import *app = QApplication(sys.argv)window = QWidget()window.setWindowTitle("社会我奥哥~~~")window.resize(500, 500)for i in range(0, 3): #设置三个控件 btn = QPushButton(window) btn.setText("BTN" + str(i)) btn.move(50 * i, 50 * i) btn.setAutoExclusive(True) #设置btn组件具有排他性 print(btn.autoExclusive()) #查看是否自动排他 btn.setCheckable(True) #设置可以被单选window.show()sys.exit(app.exec_())
模拟点击
使用代码触发按钮点击,发射相关的信号
| API |
作用 |
| click() |
普通点击 |
| animateClick(2000) |
鼠标按下后延迟松手(延迟点击) |
import sysfrom PyQt5.Qt import *app = QApplication(sys.argv)window = QWidget()window.setWindowTitle("社会我奥哥~~~")window.resize(500, 500)btn1 = QRadioButton(window)btn1.setText("BTNS")btn1.move(250,250)# btn1.click()btn1.animateClick(3200)window.show()sys.exit(app.exec_())
设置点击的有效区域
按钮中设置一个圆,点击圆才能生效
import sysfrom PyQt5.Qt import *app = QApplication(sys.argv)window = QWidget()window.setWindowTitle("社会我奥哥~~~")window.resize(500, 500)class BTN1(QPushButton): def hitButton(self, point): if point.x() >= self.width() / 2: return True return Falsebtn1 = BTN1(window)btn1.setText("BTNS")btn1.resize(200, 200)btn1.pressed.connect(lambda: print("被点击了"))class BTN2(QPushButton): def hitButton(self, point): p_x = point.x() p_y = point.y() yuan_x = self.width() / 2 yuan_y = self.height() / 2 import math distance = math.sqrt(math.pow(p_x - yuan_x, 2) + math.pow(p_y - yuan_y, 2)) if distance < yuan_x: return True return False def paintEvent(self, evt): super().paintEvent(evt) huajia = QPainter(self) huajia.setPen(QPen(QColor(100, 150, 200), 6)) huajia.drawEllipse(self.rect())btn2 = BTN2(window)btn2.setText("圆形")btn2.resize(200, 200)btn2.move(200, 0)btn2.pressed.connect(lambda: print("圆形被点击了"))window.show()sys.exit(app.exec_())
可用信号
| API |
作用 |
| pressed() |
鼠标按下信号 |
| released() |
鼠标释放(控件内移开鼠标/鼠标移除控件范围后松开) |
| clicked(clicked = false) |
控件内按下+控件内释放 |
| toggled(bool checked) |
切换信号 |
QPushButton
菜单设置
| API |
作用 |
| btn.setFlat(True) |
设置扁平化(删除默认背景) |
| setMenu(QMenu) |
创建菜单 |
| menu() |
获取菜单 |
| showMenu() |
展示菜单 |
| new_action = QAction |
创建菜单活动 |
| new_action.triggered |
菜单活动触发时的函数 |
| menu.addAction(new_action) |
给菜单添加活动 |
| menu.addMenu(open_file) |
添加子菜单 |
| menu.addSeparator() |
添加分割线 |
| btn.setMenu(menu) |
按钮添加菜单控件 |
流程:
创建菜单setMenu——创建活动QAction——设置触发函数triggered——添加活动到菜单addAction——添加子菜单addMenu——添加菜单控件setMenu
import sysfrom PyQt5.Qt import *app = QApplication(sys.argv)window = QWidget()window.setWindowTitle("Test")window.resize(500,500)btn = QPushButton(window)btn.setText("新建test")menu = QMenu() #创建菜单open_file = QMenu("test",menu) #创建内嵌菜单("名称",父对象)new_action = QAction(QIcon("../qe.jpg"),"新建",menu) #创建活动(Icon,"名称",继承自菜单)new_action.triggered.connect(lambda :print("新建文件"))test_action = QAction(QIcon("../qe.jpg"),"测试",menu)test_action.triggered.connect(lambda :print("测试文件"))quit_action = QAction(QIcon("../qe.jpg"),"退出",menu)quit_action.triggered.connect(lambda :print("退出文件"))open_file_action = QAction("打开文件",open_file)menu.addAction(new_action) #给菜单添加活动menu.addAction(test_action)open_file.addAction(open_file_action)menu.addMenu(open_file) #菜单添加子菜单menu.addSeparator() #添加分割线menu.addAction(quit_action)btn.setMenu(menu) #按钮添加菜单控件window.show()btn.showMenu()sys.exit(app.exec_())
设置默认状态
| API |
作用 |
| setAutoDefault(bool) |
设置为自动默认按钮(被点击) |
| setDefault(bool) |
设置为自动默认按钮(不用被点击) |
右键菜单
class Window(QWidget): def contextMenuEvent(self, evt):#自定义右键菜单def show_menu(point): menu = QMenu(window) open_file = QMenu("test", menu) new_action = QAction(QIcon("../qe.jpg"), "新建", menu) new_action.triggered.connect(lambda: print("新建文件")) test_action = QAction(QIcon("../qe.jpg"), "测试", menu) test_action.triggered.connect(lambda: print("测试文件")) quit_action = QAction(QIcon("../qe.jpg"), "退出", menu) quit_action.triggered.connect(lambda: print("退出文件")) open_file_action = QAction("打开文件", open_file) menu.addAction(new_action) menu.addAction(test_action) open_file.addAction(open_file_action) menu.addMenu(open_file) menu.addSeparator() menu.addAction(quit_action) # point #局部坐标点,转换为全局坐标点 dest = window.mapToGlobal(point) menu.exec_(QPoint(dest))window.setContextMenuPolicy(Qt.CustomContextMenu) #设置右键展示菜单为自定义格式window.customContextMenuRequested.connect(show_menu) #设置触发自定义菜单的函数
QCommandLinkButton
类似于单选按钮的用途,因为她用于在一组互斥选择之间进行选择。
import sysfrom PyQt5.Qt import *app = QApplication(sys.argv)window = QWidget()window.setWindowTitle("Test")window.resize(500,500)com = QCommandLinkButton("标题","描述",window)com.setText("修改标题")com.setDescription("修改描述")com.setIcon(QIcon("../qe.jpg"))window.show()sys.exit(app.exec_())
QToolButton
提供了一个快速访问按钮
通常是在工具栏内部使用
工具按钮通常不显示文本标签,而是显示图标
import sysfrom PyQt5.Qt import *app = QApplication(sys.argv)window = QWidget()window.setWindowTitle("Test")window.resize(500,500)tls = QToolButton(window)tls.setText("test")tls.setIcon(QIcon("../qe.jpg")) #优先展示图片,图片会覆盖文本tls.setIconSize(QSize(60,60))tls.setToolTip("这是新建按钮")window.show()sys.exit(app.exec_())
工具按钮样式设置
| API |
作用 |
| tls.setToolButtonStyle |
设置QToolButton样式 |
| Qt.ToolButtonIconOnly |
仅显示图标 |
| Qt.ToolButtonTextOnly |
仅显示文字 |
| Qt.ToolButtonTextBesideIcon |
文本显示在图标旁边 |
| Qt.ToolButtonTextUnderIcon |
文本显示在图标下方 |
| Qt.ToolButtonFollowStyle |
遵循风格 |
| toolButtonStyle() |
查看样式 |
tls.setToolButtonStyle(Qt.ToolButtonFollowStyle)# Qt.ToolButtonIconOnly# 仅显示图标# Qt.ToolButtonTextOnly# 仅显示文字# Qt.ToolButtonTextBesideIcon# 文本显示在图标旁边# Qt.ToolButtonTextUnderIcon# 文本显示在图标下方# Qt.ToolButtonFollowStyle# 遵循风格
箭头类型操作
将按钮变成一个具备特殊箭头图标的按钮
| API |
作用 |
| Qt.NoArrow |
无箭头 |
| Qt.UpArrow |
向上箭头 |
| Qt.DownArrow |
向下箭头 |
| Qt.LeftArrow |
向左箭头 |
| Qt.RightArrow |
向右箭头 |
# Qt.NoArrow# 无箭头# Qt.UpArrow# 向上箭头# Qt.DownArrow# 向下箭头# Qt.LeftArrow# 向左箭头# Qt.RightArrow# 向右箭头tls.setArrowType(Qt.RightArrow)
自动提升(取消框)
在自动提升模式下,该按钮仅在鼠标指向时才会绘制3D帧。在工具栏(QToolBar)中, 默认就是自动提升。

import sysfrom PyQt5.Qt import *app = QApplication(sys.argv)window = QWidget()window.setWindowTitle("Test")window.resize(500,500)tls = QToolButton(window)tls.setText("工具")tls.setToolTip("这是新建按钮")tls.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)tls.setArrowType(Qt.RightArrow)tls.setAutoRaise(True) #设置自动提升window.show()sys.exit(app.exec_())
菜单和弹出模式
设置菜单弹出的触发方式
| API |
应用 |
| QToolButton.DelayedPopup |
鼠标按住一会才显示,类似于浏览器后退按钮 |
| QToolButton.MenuButtonPopup |
有一个专门的指示箭头,点击箭头才显示 |
| QToolButton.InstantPopup |
点了按钮就显示,点击信号不会发射 |
import sysfrom PyQt5.Qt import *app = QApplication(sys.argv)window = QWidget()window.setWindowTitle("Test")window.resize(500, 500)tls = QToolButton(window)tls.setText("工具")tls.setToolTip("这是新建按钮")tls.setAutoRaise(True)tls.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)tls.setArrowType(Qt.RightArrow)menu = QMenu(tls)sub_menu = QMenu(menu)sub_menu.setTitle("子菜单") #设置菜单标题sub_menu.setIcon(QIcon("../qe.jpg")) #设置菜单图标action = QAction(QIcon("../qe.jpg"),"行为") #设置行为按钮action.triggered.connect(lambda : print("点击了按钮")) #设置行为触发的函数menu.addMenu(sub_menu) #添加子菜单menu.addSeparator() #添加分割线menu.addAction(action) #添加行为按钮tls.setMenu(menu)# tls.setPopupMode(QToolButton.MenuButtonPopup)tls.setPopupMode(QToolButton.InstantPopup)window.show()sys.exit(app.exec_())
全体按钮设置信号
设置全部按钮的通用信号。并且通过Action信号绑定数据
| API |
应用 |
| tls.triggered.connect(action) |
全部菜单按钮都会触发该信号 |
| setData(Any) |
绑定数据 |
| data() |
获取数据 |
def do_action(action): print("点击行为",action)tls.triggered.connect(do_action) #设置后tls的全部菜单按钮都会触发该信号
QRadioButton
多个选项中的单选按钮,一般用于给用户提供若干选项中的单选操作,此按钮左侧会有一个圆圈图标, 用于标识用户的选中状态
import sysfrom PyQt5.Qt import *app = QApplication(sys.argv)window = QWidget()window.setWindowTitle("Test")window.resize(500,500)rb_nan = QRadioButton("男-&B",window)rb_nan.move(100,100)rb_nan.setIcon(QIcon("../qe.jpg"))rb_nan.setChecked(True)rb_nv = QRadioButton("女-&G",window)rb_nv.move(100,150)rb_nv.setIcon(QIcon("../qe.jpg"))window.show()sys.exit(app.exec_())
信号的使用
| API |
作用 |
| pressed() |
鼠标按下信号 |
| released() |
鼠标释放(控件内移开鼠标/鼠标移除控件范围后松开) |
| clicked(clicked = false) |
控件内按下+控件内释放 |
| toggled(bool checked) |
切换信号 最常用 |
多组互斥
方法1:创建Qwidget 不推荐 建议使用按钮组
QButtonGroup
提供 一个抽象的按钮容器, 可以将多个按钮划分为一组。不具备可视化的效果,一般放的都是可以被检查的按钮
| API |
作用 |
| QButtonGroup(window) |
创建按钮控件组 |
| addButton(r_m) |
为组添加控件 |
import sysfrom PyQt5.Qt import *app = QApplication(sys.argv)window = QWidget()window.setWindowTitle("Test")window.resize(500,500)r_m = QRadioButton("男",window)r_m.move(100,50)r_n = QRadioButton("女",window)r_n.move(100,100)x_group = QButtonGroup(window)x_group.addButton(r_m)x_group.addButton(r_n)r_yes = QRadioButton("yes",window)r_yes.move(150,50)r_no = QRadioButton("no",window)r_no.move(150,100)y_group = QButtonGroup(window)y_group.addButton(r_yes)y_group.addButton(r_no)window.show()sys.exit(app.exec_())
查看组中按钮
| API |
作用 |
| buttons() |
查看所有按钮组中的按钮 |
| button(ID) |
根据ID获取对应按钮, 没有则返回None |
| checkedButton() |
获取选中的那个按钮 |
| removeButton(r_m) |
移除组中的按钮 |
import sysfrom PyQt5.Qt import *app = QApplication(sys.argv)window = QWidget()window.setWindowTitle("Test")window.resize(500,500)r_m = QRadioButton("男",window)r_m.move(100,50)r_n = QRadioButton("女",window)r_n.move(100,100)r_m.setChecked(True)x_group = QButtonGroup(window)x_group.addButton(r_m,1) #ID为1x_group.addButton(r_n,2) #ID为2r_yes = QRadioButton("yes",window)r_yes.move(150,50)r_no = QRadioButton("no",window)r_no.move(150,100)y_group = QButtonGroup(window)y_group.addButton(r_yes)y_group.addButton(r_no)print(x_group.button(1)) #打印组中ID为1的按钮print(y_group.buttons()) #打印组中全部的按钮print(x_group.checkedButton()) #打印组中被选中的按钮window.show()sys.exit(app.exec_())
ID的操作
| API |
作用 |
| print(y_group.id(r_no)) |
打印该组中某个按钮的ID |
| y_group.setId(r_no,2) |
设置该组中按钮的ID |
| print(y_group.checkedId()) |
打印出被选择框的ID |
独占设置
| API |
作用 |
| x_group.setExclusive(True) |
设置为独占互斥,只能选一个 |
| x_group.setExclusive(False) |
不设置为独占,都能选 |
| x_group.exclusive |
查看是否为独占 |
信号的使用
| API |
作用 |
| buttonClicked |
当按钮组中的按钮被点击时, 发射此信号 |
| buttonPressed |
当按钮组中的按钮被按下时, 发射此信号 |
| buttonReleased |
当按钮组中的按钮被释放时, 发射此信号 |
| buttonToggled |
当按钮组中的按钮被切换状态时, 发射此信号,会发射两次 |
def clicked(val): #val 传输的是组的ID号 print("我被按下了") print(x_group.id(val)) #打印出组ID号x_group.buttonClicked[int].connect(clicked) #末尾加上int 执行时附带int数值x_group.buttonPressed.connect(clicked)x_group.buttonReleased.connect(clicked)x_group.buttonToggled.connect(clicked)
如果一个对象向外界提供的信号名称一样, 但参数不一样,外界在使用信号时, 可以使用如下格式进行选择
QCheckBox