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) 设置绘画的图形
  1. import sys
  2. from PyQt5.Qt import *
  3. app = QApplication(sys.argv)
  4. window = QWidget()
  5. window.setWindowTitle("芜湖")
  6. window.resize(500,500)
  7. class Btn1(QAbstractButton): #重写控件
  8. def paintEvent(self, evt): #重写绘画时间
  9. huajia = QPainter(self) #创建 绘画者
  10. pen = QPen(QColor(10,100,100),10) #创建 画笔 RGB 控件大小
  11. huajia.setPen(pen) #设置 画笔
  12. huajia.drawText(25,40,self.text()) #绘画一个文本控件 X Y 绘画文本变量
  13. huajia.drawEllipse(0,0,100,100) #设置绘画图形
  14. btn = Btn1(window) #调用控件
  15. btn.setText("123") #设置文本
  16. btn.resize(100,100) #设置大小
  17. btn.pressed.connect(lambda : print("点击了一下")) #绑定事件
  18. window.show()
  19. sys.exit(app.exec_())

文本设置

  1. import sys
  2. from PyQt5.Qt import *
  3. app = QApplication(sys.argv)
  4. window = QWidget()
  5. window.setWindowTitle("Test")
  6. window.resize(500,500)
  7. btn = QPushButton(window)
  8. btn.setText("1") #设置文本
  9. def plus_one():
  10. x = int(btn.text()) + 1 #btn.text 获取文本
  11. btn.setText(str(x))
  12. btn.pressed.connect(plus_one)
  13. window.show()
  14. sys.exit(app.exec_())

图标设置/按钮添加图片

API 作用
icon = QIcon(“../qe.jpg”) 设置图片文件位置
btn.setIcon(icon) 设置按钮要添加的图片
size = QSize(80,80) 设置图片文件的大小参数
btn.setIconSize(size) 设置按钮的大小
  1. import sys
  2. from PyQt5.Qt import *
  3. app = QApplication(sys.argv)
  4. window = QWidget()
  5. window.setWindowTitle("Test")
  6. window.resize(500,500)
  7. btn = QPushButton(window)
  8. btn.resize(200,90)
  9. icon = QIcon("../qe.jpg")
  10. btn.setIcon(icon)
  11. size = QSize(80,80)
  12. btn.setIconSize(size)
  13. window.show()
  14. sys.exit(app.exec_())

快捷键设置

API 作用
btn.setShortcut(“Alt+y”) 自定义快捷键
btn1.setText(“a&bc”) 给字符串加上& 函数自动配置快捷键
  1. import sys
  2. from PyQt5.Qt import *
  3. app = QApplication(sys.argv)
  4. window = QWidget()
  5. window.setWindowTitle("社会我奥哥~~~")
  6. window.resize(500,500)
  7. btn = QPushButton(window)
  8. btn.setText("1")
  9. btn.setShortcut("Alt+y") #自定义快捷键
  10. btn1 = QPushButton(window)
  11. btn1.setText("a&bc") #让函数帮忙设置快捷键
  12. btn.move(100,100)
  13. btn1.pressed.connect(lambda : print("abc 我被点击了"))
  14. window.show()
  15. sys.exit(app.exec_())

自动重复

API 作用
setAutoRepeat(bool) 设置自动重复
setAutoRepeatInterval() 设置自动重复检测间隔
setAutoRepeatDelay() 设置初次检测延迟
autoRepeat() 获取是否自动重复
autoRepeatInterval() 获取自动重复检测间隔
autoRepeatDelay() 获取初次检测延迟

不松开鼠标重复执行函数 当用户点击按钮后, 想快速重复性响应时设置

  1. import sys
  2. from PyQt5.Qt import *
  3. app = QApplication(sys.argv)
  4. window = QWidget()
  5. window.setWindowTitle("社会我奥哥~~~")
  6. window.resize(500,500)
  7. btn1 = QPushButton(window)
  8. btn1.setText("1")
  9. btn1.move(100,100)
  10. btn1.setAutoRepeat(True) #设置自动重复
  11. btn1.setAutoRepeatDelay(100) #设置初次检测延迟
  12. btn1.setAutoRepeatInterval(100) #设置初次自动重复检测延迟
  13. def onclick_ed():
  14. x = int(btn1.text()) + 1
  15. btn1.setText(str(x))
  16. btn1.pressed.connect(onclick_ed)
  17. window.show()
  18. sys.exit(app.exec_())

状态设置

判定按钮的状态

API 作用
isDown() 是否按下按钮
setDown(bool) 设置按钮, 是否被按下
isChecked() 是否选中了按钮
isCheckable() 按钮是否可以被选中
setCheckable(bool) 设置按钮, 是否可以被选中
setChecked(bool) 设置按钮, 是否被选中
toggle() 切换选中与非选中状态
isEnabled() 是否为开启
setEnabled(bool) 设置是否为开启
  1. import sys
  2. from PyQt5.Qt import *
  3. app = QApplication(sys.argv)
  4. window = QWidget()
  5. window.setWindowTitle("社会我奥哥~~~")
  6. window.resize(500,500)
  7. push_button = QPushButton(window) #创建三个按钮
  8. push_button.setText("点我按下")
  9. push_button.move(100,100)
  10. radio_b = QRadioButton(window) #创建三个按钮
  11. radio_b.setText("点我选择")
  12. radio_b.move(100,200)
  13. check_b = QCheckBox(window) #创建三个按钮
  14. check_b.setText("点我多选")
  15. check_b.move(100,300)
  16. btn1 = QPushButton(window)
  17. btn1.setText("点击更换")
  18. push_button.setDown(True) #设置按下状态
  19. check_b.setDown(True)
  20. radio_b.setDown(True)
  21. push_button.setCheckable(True) #设置普通按钮也能被选中
  22. print(push_button.isCheckable()) #打印选中状态
  23. print(check_b.isCheckable())
  24. print(radio_b.isCheckable())
  25. push_button.setChecked(True) #设置为选中状态
  26. radio_b.setChecked(True)
  27. check_b.setChecked(True)
  28. def changes():
  29. push_button.toggle() #切换为选中与非选中状态
  30. radio_b.toggle()
  31. check_b.toggle()
  32. btn1.pressed.connect(changes)
  33. print(push_button.isEnabled())
  34. window.show()
  35. sys.exit(app.exec_())

排他性

设置组件中的一些按钮,只能单选。
如果同时存在多个按钮, 而此时所有按钮又设置了排他性,则在同一时刻只能选中一个按钮

API 作用
autoExclusive() 是否自动排他
setAutoExclusive(bool) 设置自动排他
  1. import sys
  2. from PyQt5.Qt import *
  3. app = QApplication(sys.argv)
  4. window = QWidget()
  5. window.setWindowTitle("社会我奥哥~~~")
  6. window.resize(500, 500)
  7. for i in range(0, 3): #设置三个控件
  8. btn = QPushButton(window)
  9. btn.setText("BTN" + str(i))
  10. btn.move(50 * i, 50 * i)
  11. btn.setAutoExclusive(True) #设置btn组件具有排他性
  12. print(btn.autoExclusive()) #查看是否自动排他
  13. btn.setCheckable(True) #设置可以被单选
  14. window.show()
  15. sys.exit(app.exec_())

模拟点击

使用代码触发按钮点击,发射相关的信号

API 作用
click() 普通点击
animateClick(2000) 鼠标按下后延迟松手(延迟点击)
  1. import sys
  2. from PyQt5.Qt import *
  3. app = QApplication(sys.argv)
  4. window = QWidget()
  5. window.setWindowTitle("社会我奥哥~~~")
  6. window.resize(500, 500)
  7. btn1 = QRadioButton(window)
  8. btn1.setText("BTNS")
  9. btn1.move(250,250)
  10. # btn1.click()
  11. btn1.animateClick(3200)
  12. window.show()
  13. sys.exit(app.exec_())

设置点击的有效区域

按钮中设置一个圆,点击圆才能生效

  1. import sys
  2. from PyQt5.Qt import *
  3. app = QApplication(sys.argv)
  4. window = QWidget()
  5. window.setWindowTitle("社会我奥哥~~~")
  6. window.resize(500, 500)
  7. class BTN1(QPushButton):
  8. def hitButton(self, point):
  9. if point.x() >= self.width() / 2:
  10. return True
  11. return False
  12. btn1 = BTN1(window)
  13. btn1.setText("BTNS")
  14. btn1.resize(200, 200)
  15. btn1.pressed.connect(lambda: print("被点击了"))
  16. class BTN2(QPushButton):
  17. def hitButton(self, point):
  18. p_x = point.x()
  19. p_y = point.y()
  20. yuan_x = self.width() / 2
  21. yuan_y = self.height() / 2
  22. import math
  23. distance = math.sqrt(math.pow(p_x - yuan_x, 2) + math.pow(p_y - yuan_y, 2))
  24. if distance < yuan_x:
  25. return True
  26. return False
  27. def paintEvent(self, evt):
  28. super().paintEvent(evt)
  29. huajia = QPainter(self)
  30. huajia.setPen(QPen(QColor(100, 150, 200), 6))
  31. huajia.drawEllipse(self.rect())
  32. btn2 = BTN2(window)
  33. btn2.setText("圆形")
  34. btn2.resize(200, 200)
  35. btn2.move(200, 0)
  36. btn2.pressed.connect(lambda: print("圆形被点击了"))
  37. window.show()
  38. 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

  1. import sys
  2. from PyQt5.Qt import *
  3. app = QApplication(sys.argv)
  4. window = QWidget()
  5. window.setWindowTitle("Test")
  6. window.resize(500,500)
  7. btn = QPushButton(window)
  8. btn.setText("新建test")
  9. menu = QMenu() #创建菜单
  10. open_file = QMenu("test",menu) #创建内嵌菜单("名称",父对象)
  11. new_action = QAction(QIcon("../qe.jpg"),"新建",menu) #创建活动(Icon,"名称",继承自菜单)
  12. new_action.triggered.connect(lambda :print("新建文件"))
  13. test_action = QAction(QIcon("../qe.jpg"),"测试",menu)
  14. test_action.triggered.connect(lambda :print("测试文件"))
  15. quit_action = QAction(QIcon("../qe.jpg"),"退出",menu)
  16. quit_action.triggered.connect(lambda :print("退出文件"))
  17. open_file_action = QAction("打开文件",open_file)
  18. menu.addAction(new_action) #给菜单添加活动
  19. menu.addAction(test_action)
  20. open_file.addAction(open_file_action)
  21. menu.addMenu(open_file) #菜单添加子菜单
  22. menu.addSeparator() #添加分割线
  23. menu.addAction(quit_action)
  24. btn.setMenu(menu) #按钮添加菜单控件
  25. window.show()
  26. btn.showMenu()
  27. sys.exit(app.exec_())

设置默认状态

API 作用
setAutoDefault(bool) 设置为自动默认按钮(被点击)
setDefault(bool) 设置为自动默认按钮(不用被点击)

右键菜单

  1. class Window(QWidget):
  2. def contextMenuEvent(self, evt):
  3. #自定义右键菜单
  4. def show_menu(point):
  5. menu = QMenu(window)
  6. open_file = QMenu("test", menu)
  7. new_action = QAction(QIcon("../qe.jpg"), "新建", menu)
  8. new_action.triggered.connect(lambda: print("新建文件"))
  9. test_action = QAction(QIcon("../qe.jpg"), "测试", menu)
  10. test_action.triggered.connect(lambda: print("测试文件"))
  11. quit_action = QAction(QIcon("../qe.jpg"), "退出", menu)
  12. quit_action.triggered.connect(lambda: print("退出文件"))
  13. open_file_action = QAction("打开文件", open_file)
  14. menu.addAction(new_action)
  15. menu.addAction(test_action)
  16. open_file.addAction(open_file_action)
  17. menu.addMenu(open_file)
  18. menu.addSeparator()
  19. menu.addAction(quit_action)
  20. # point #局部坐标点,转换为全局坐标点
  21. dest = window.mapToGlobal(point)
  22. menu.exec_(QPoint(dest))
  23. window.setContextMenuPolicy(Qt.CustomContextMenu) #设置右键展示菜单为自定义格式
  24. window.customContextMenuRequested.connect(show_menu) #设置触发自定义菜单的函数

QCommandLinkButton

类似于单选按钮的用途,因为她用于在一组互斥选择之间进行选择。

  1. import sys
  2. from PyQt5.Qt import *
  3. app = QApplication(sys.argv)
  4. window = QWidget()
  5. window.setWindowTitle("Test")
  6. window.resize(500,500)
  7. com = QCommandLinkButton("标题","描述",window)
  8. com.setText("修改标题")
  9. com.setDescription("修改描述")
  10. com.setIcon(QIcon("../qe.jpg"))
  11. window.show()
  12. sys.exit(app.exec_())

QToolButton

提供了一个快速访问按钮
通常是在工具栏内部使用
工具按钮通常不显示文本标签,而是显示图标

  1. import sys
  2. from PyQt5.Qt import *
  3. app = QApplication(sys.argv)
  4. window = QWidget()
  5. window.setWindowTitle("Test")
  6. window.resize(500,500)
  7. tls = QToolButton(window)
  8. tls.setText("test")
  9. tls.setIcon(QIcon("../qe.jpg")) #优先展示图片,图片会覆盖文本
  10. tls.setIconSize(QSize(60,60))
  11. tls.setToolTip("这是新建按钮")
  12. window.show()
  13. sys.exit(app.exec_())

工具按钮样式设置

API 作用
tls.setToolButtonStyle 设置QToolButton样式
Qt.ToolButtonIconOnly 仅显示图标
Qt.ToolButtonTextOnly 仅显示文字
Qt.ToolButtonTextBesideIcon 文本显示在图标旁边
Qt.ToolButtonTextUnderIcon 文本显示在图标下方
Qt.ToolButtonFollowStyle 遵循风格
toolButtonStyle() 查看样式
  1. tls.setToolButtonStyle(Qt.ToolButtonFollowStyle)
  2. # Qt.ToolButtonIconOnly
  3. # 仅显示图标
  4. # Qt.ToolButtonTextOnly
  5. # 仅显示文字
  6. # Qt.ToolButtonTextBesideIcon
  7. # 文本显示在图标旁边
  8. # Qt.ToolButtonTextUnderIcon
  9. # 文本显示在图标下方
  10. # Qt.ToolButtonFollowStyle
  11. # 遵循风格

箭头类型操作

将按钮变成一个具备特殊箭头图标的按钮

API 作用
Qt.NoArrow 无箭头
Qt.UpArrow 向上箭头
Qt.DownArrow 向下箭头
Qt.LeftArrow 向左箭头
Qt.RightArrow 向右箭头
  1. # Qt.NoArrow
  2. # 无箭头
  3. # Qt.UpArrow
  4. # 向上箭头
  5. # Qt.DownArrow
  6. # 向下箭头
  7. # Qt.LeftArrow
  8. # 向左箭头
  9. # Qt.RightArrow
  10. # 向右箭头
  11. tls.setArrowType(Qt.RightArrow)

自动提升(取消框)

在自动提升模式下,该按钮仅在鼠标指向时才会绘制3D帧。在工具栏(QToolBar)中, 默认就是自动提升。
image.png

  1. import sys
  2. from PyQt5.Qt import *
  3. app = QApplication(sys.argv)
  4. window = QWidget()
  5. window.setWindowTitle("Test")
  6. window.resize(500,500)
  7. tls = QToolButton(window)
  8. tls.setText("工具")
  9. tls.setToolTip("这是新建按钮")
  10. tls.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
  11. tls.setArrowType(Qt.RightArrow)
  12. tls.setAutoRaise(True) #设置自动提升
  13. window.show()
  14. sys.exit(app.exec_())

菜单和弹出模式

设置菜单弹出的触发方式

API 应用
QToolButton.DelayedPopup 鼠标按住一会才显示,类似于浏览器后退按钮
QToolButton.MenuButtonPopup 有一个专门的指示箭头,点击箭头才显示
QToolButton.InstantPopup 点了按钮就显示,点击信号不会发射
  1. import sys
  2. from PyQt5.Qt import *
  3. app = QApplication(sys.argv)
  4. window = QWidget()
  5. window.setWindowTitle("Test")
  6. window.resize(500, 500)
  7. tls = QToolButton(window)
  8. tls.setText("工具")
  9. tls.setToolTip("这是新建按钮")
  10. tls.setAutoRaise(True)
  11. tls.setToolButtonStyle(Qt.ToolButtonTextBesideIcon)
  12. tls.setArrowType(Qt.RightArrow)
  13. menu = QMenu(tls)
  14. sub_menu = QMenu(menu)
  15. sub_menu.setTitle("子菜单") #设置菜单标题
  16. sub_menu.setIcon(QIcon("../qe.jpg")) #设置菜单图标
  17. action = QAction(QIcon("../qe.jpg"),"行为") #设置行为按钮
  18. action.triggered.connect(lambda : print("点击了按钮")) #设置行为触发的函数
  19. menu.addMenu(sub_menu) #添加子菜单
  20. menu.addSeparator() #添加分割线
  21. menu.addAction(action) #添加行为按钮
  22. tls.setMenu(menu)
  23. # tls.setPopupMode(QToolButton.MenuButtonPopup)
  24. tls.setPopupMode(QToolButton.InstantPopup)
  25. window.show()
  26. sys.exit(app.exec_())

全体按钮设置信号

设置全部按钮的通用信号。并且通过Action信号绑定数据

API 应用
tls.triggered.connect(action) 全部菜单按钮都会触发该信号
setData(Any) 绑定数据
data() 获取数据
  1. def do_action(action):
  2. print("点击行为",action)
  3. tls.triggered.connect(do_action) #设置后tls的全部菜单按钮都会触发该信号

QRadioButton

多个选项中的单选按钮,一般用于给用户提供若干选项中的单选操作,此按钮左侧会有一个圆圈图标, 用于标识用户的选中状态

  1. import sys
  2. from PyQt5.Qt import *
  3. app = QApplication(sys.argv)
  4. window = QWidget()
  5. window.setWindowTitle("Test")
  6. window.resize(500,500)
  7. rb_nan = QRadioButton("男-&B",window)
  8. rb_nan.move(100,100)
  9. rb_nan.setIcon(QIcon("../qe.jpg"))
  10. rb_nan.setChecked(True)
  11. rb_nv = QRadioButton("女-&G",window)
  12. rb_nv.move(100,150)
  13. rb_nv.setIcon(QIcon("../qe.jpg"))
  14. window.show()
  15. sys.exit(app.exec_())

信号的使用

API 作用
pressed() 鼠标按下信号
released() 鼠标释放(控件内移开鼠标/鼠标移除控件范围后松开)
clicked(clicked = false) 控件内按下+控件内释放
toggled(bool checked) 切换信号 最常用

多组互斥

方法1:创建Qwidget 不推荐 建议使用按钮组

QButtonGroup

提供 一个抽象的按钮容器, 可以将多个按钮划分为一组。不具备可视化的效果,一般放的都是可以被检查的按钮

API 作用
QButtonGroup(window) 创建按钮控件组
addButton(r_m) 为组添加控件
  1. import sys
  2. from PyQt5.Qt import *
  3. app = QApplication(sys.argv)
  4. window = QWidget()
  5. window.setWindowTitle("Test")
  6. window.resize(500,500)
  7. r_m = QRadioButton("男",window)
  8. r_m.move(100,50)
  9. r_n = QRadioButton("女",window)
  10. r_n.move(100,100)
  11. x_group = QButtonGroup(window)
  12. x_group.addButton(r_m)
  13. x_group.addButton(r_n)
  14. r_yes = QRadioButton("yes",window)
  15. r_yes.move(150,50)
  16. r_no = QRadioButton("no",window)
  17. r_no.move(150,100)
  18. y_group = QButtonGroup(window)
  19. y_group.addButton(r_yes)
  20. y_group.addButton(r_no)
  21. window.show()
  22. sys.exit(app.exec_())

查看组中按钮

API 作用
buttons() 查看所有按钮组中的按钮
button(ID) 根据ID获取对应按钮, 没有则返回None
checkedButton() 获取选中的那个按钮
removeButton(r_m) 移除组中的按钮
  1. import sys
  2. from PyQt5.Qt import *
  3. app = QApplication(sys.argv)
  4. window = QWidget()
  5. window.setWindowTitle("Test")
  6. window.resize(500,500)
  7. r_m = QRadioButton("男",window)
  8. r_m.move(100,50)
  9. r_n = QRadioButton("女",window)
  10. r_n.move(100,100)
  11. r_m.setChecked(True)
  12. x_group = QButtonGroup(window)
  13. x_group.addButton(r_m,1) #ID为1
  14. x_group.addButton(r_n,2) #ID为2
  15. r_yes = QRadioButton("yes",window)
  16. r_yes.move(150,50)
  17. r_no = QRadioButton("no",window)
  18. r_no.move(150,100)
  19. y_group = QButtonGroup(window)
  20. y_group.addButton(r_yes)
  21. y_group.addButton(r_no)
  22. print(x_group.button(1)) #打印组中ID为1的按钮
  23. print(y_group.buttons()) #打印组中全部的按钮
  24. print(x_group.checkedButton()) #打印组中被选中的按钮
  25. window.show()
  26. 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 当按钮组中的按钮被切换状态时, 发射此信号,会发射两次
  1. def clicked(val): #val 传输的是组的ID号
  2. print("我被按下了")
  3. print(x_group.id(val)) #打印出组ID号
  4. x_group.buttonClicked[int].connect(clicked) #末尾加上int 执行时附带int数值
  5. x_group.buttonPressed.connect(clicked)
  6. x_group.buttonReleased.connect(clicked)
  7. x_group.buttonToggled.connect(clicked)

如果一个对象向外界提供的信号名称一样, 但参数不一样,外界在使用信号时, 可以使用如下格式进行选择

QCheckBox