PyQt5 基本语法(二):按钮控件
按照继承关系来学习
1、按钮控件
1.1 QAbstractButton
1.1.1 简介
1.1.1.1 描述
- 所有按钮控件的基类
- 提供按钮的通用功能
- 其继承自 QWidget
- 其为 C++ 中的虚继承类,无法实例化对象,只有子类化,才能实例化对象
1.1.1.2 自定义按钮
#!/usr/bin/env python # -*- coding: UTF-8 -*- # @author: kun from PyQt5.Qt import * import sys class Btn(QAbstractButton): # 子类化,使得可以实例化对象,同时要重写paintEvent函数 def paintEvent(self, evt): # 这个可以自定义一个按钮 # print("绘制按钮") # 创建一个画家,self 是纸张 painter = QPainter(self) # 实例化一支笔 pen = QPen(QColor(0, 0, 0), 6) # 颜色,和画笔大小 # 给画家一支笔 painter.setPen(pen) # 画画 painter.drawText(20, 20, self.text()) # 将字写在按钮上面 painter.drawEllipse(0, 0, 100, 100) # 画一个椭圆 app = QApplication(sys.argv) w = QWidget() w.resize(500, 500) btn = Btn(w) btn.setText("QAbstractButton") btn.pressed.connect(lambda: print("自定义按钮被按下了")) w.setVisible(True) # 设置为可见 sys.exit(app.exec_())
1.1.2 提示文本
案例,创建一个按钮,初始文本为1
要求:
- 每点击一次,则让文本数字加1
涉及知识点:
- 按钮控件的创建
- 按钮文本的设置和获取
- 按钮点击信号的监听
#!/usr/bin/env python # -*- coding: UTF-8 -*- # @author: kun from PyQt5.Qt import * import sys app = QApplication(sys.argv) w = QWidget() w.resize(500, 500) btn = QPushButton(w) btn.setText("1") # 设置初始文本 def btn_(): count = int(btn.text()) count += 1 # 加一功能 btn.setText(str(count)) btn.pressed.connect(btn_) # 监听事件 w.setVisible(True) # 设置为可见 sys.exit(app.exec_())
1.1.3 图标相关
#!/usr/bin/env python # -*- coding: UTF-8 -*- # @author: kun from PyQt5.Qt import * import sys """ setIcon(QIcon) # 设置图标 setIconSize(ASize) # 设置图标大小 icon() # 获取图标 iconSize() # 获取图标大小 """ app = QApplication(sys.argv) w = QWidget() w.resize(500, 500) btn = QPushButton(w) btn.setText("Button") # 设置初始文本 icon = QIcon(r"D:\35005\Pictures\Screenshots\微信图片_20220302175157.jpg") # 设置图片 btn.setIcon(icon) # 设置图标 size = QSize(20, 20) # 输入图标大小 btn.setIconSize(size) # 设置图标大小 w.setVisible(True) # 设置为可见 sys.exit(app.exec_())
1.1.4 设置快捷键
作用:
- 通过指定的快捷键,触发按钮的点击
方式:
- 有提示文本:如果提示文本包含 & 符号,则QAbstractButton会自动创建快捷键
- 无提示文本:
setShortcut("Alt + G")
#!/usr/bin/env python # -*- coding: UTF-8 -*- # @author: kun from PyQt5.Qt import * import sys app = QApplication(sys.argv) w = QWidget() w.resize(500, 500) btn = QPushButton(w) btn.clicked.connect(lambda: print("按钮被按下")) # btn.setText("a&bc") # 有文本创建,快捷键为 Alt + b btn.setText("点我") btn.setShortcut("Alt+G") # 无文本的创建方法 w.show() sys.exit(app.exec_())
1.1.5 按钮自动重复
#!/usr/bin/env python # -*- coding: UTF-8 -*- # @author: kun from PyQt5.Qt import * import sys """ # 当一直摁下不松开触发重复 setAutoRepeat(bool) # 设置自动重复 setAutoRepeatInterval(ms) # 设置自动重复检测间隔 setAutoRepeatDelay(ms) # 设置初次检测延迟 autoRepeat() # 获取是否自动重复 autoRepeatInterval() # 获取自动重复检测间隔 autoRepeatDelay() # 获取初次检测延迟时长 """ app = QApplication(sys.argv) w = QWidget() w.resize(500, 500) btn = QPushButton(w) btn.setText("点我") btn.clicked.connect(lambda: print("点击一次")) btn.setAutoRepeat(True) # 开启重复 btn.setAutoRepeatInterval(1000) # 设置 1 秒间隔 btn.setAutoRepeatDelay(2000) # 摁下两秒后触发重复 # 获取值 print(btn.autoRepeat()) print(btn.autoRepeatInterval()) print(btn.autoRepeatDelay()) w.show() sys.exit(app.exec_())
1.1.6 状态检测
#!/usr/bin/env python # -*- coding: UTF-8 -*- # @author: kun from PyQt5.Qt import * import sys """ isDown() # 是否按下按钮 setDown(bool) # 设置按钮是否被按下 isChecked() # 是否选中了按钮 setChecked() # 设置按钮是否被选中 isCheckable() # 按钮是否可以被选中 setCheckable(bool) # 设置按钮是否可以被选中 toggle() # 切换选中与非选中状态 # 继承与QWidget中能使用的状态 isEnabled() # 判断按钮是否能点击 setEnabled(bool) # 设置按钮是否能点击 """ app = QApplication(sys.argv) w = QWidget() w.resize(500, 500) btn = QPushButton(w) btn.setText("QPushButton") btn.move(50, 0) btn2 = QRadioButton(w) btn2.setText("QRadioButton") btn2.move(50, 50) btn3 = QCheckBox(w) btn3.setText("QCheckBox") btn3.move(50, 100) # 把三个按钮全部置为按下状态 btn.setStyleSheet("QPushButton:pressed {background-color: red;}") btn.setDown(True) btn2.setChecked(True) btn3.toggle() # 打印状态 print(btn.isCheckable()) print(btn2.isChecked()) print(btn3.isDown()) w.show() sys.exit(app.exec_())
1.1.7 排他性
如果同时存在多个按钮,而此时所有按钮有设置了排他性,则,在同一时刻只能选中一个按钮
#!/usr/bin/env python # -*- coding: UTF-8 -*- # @author: kun from PyQt5.Qt import * import sys """ autoExclusion() # 是否有排他性,一般按钮都是 False 只有单选按钮是 True setAutoExclusion() # 设置自动排他性 # 使用场景,设定按钮中的按钮,单选特性,范围是同一级别 """ app = QApplication(sys.argv) w = QWidget() w.resize(500, 500) for i in range(3): btn = QPushButton(w) btn.setText(f"QPushButton{i}") btn.move(i * 50, i * 50) btn.setAutoExclusive(True) # 设置具有自动排他性 print(btn.autoExclusive()) # 查看是否有自动排他性 btn.setCheckable(True) # 使得按钮可以被选中 w.show() sys.exit(app.exec_())
1.1.8 点击
#!/usr/bin/env python # -*- coding: UTF-8 -*- # @author: kun from PyQt5.Qt import * import sys """ click() 普通点击 animateClick() # 动画点击 """ app = QApplication(sys.argv) w = QWidget() btn = QPushButton(w) btn.setText("按钮") btn.pressed.connect(lambda: print("点击了按钮")) btn.click() # 模拟用户对按钮的点击 btn.animateClick(2000) # 点击按钮后,持续两秒,再松开 w.show() sys.exit(app.exec_())
1.1.9 设置点击区域
#!/usr/bin/env python # -*- coding: UTF-8 -*- # @author: kun from PyQt5.Qt import * import sys # 通过方法重写来实现 class MyBtn(QPushButton): def hitButton(self, pos): # print(pos.x()) 返回相对于按钮左上角的坐标 # 如果点击有效,就返回 True,才会发送信号;返回False就不会发射信号 return True if pos.x() < self.width() / 2 else False # 设置成只有点击左半部分才有效 app = QApplication(sys.argv) w = QWidget() btn = MyBtn(w) btn.setText("按钮") btn.pressed.connect(lambda: print("点击了按钮")) w.show() sys.exit(app.exec_())
1.1.10 信号
#!/usr/bin/env python # -*- coding: UTF-8 -*- # @author: kun from PyQt5.Qt import * import sys """ pressed() # 鼠标按下 released() # 鼠标释放,鼠标在控件内松开;鼠标移出控件范围后 clicked(checked = false) # 控件按下 + 控件内释放 toggle(bool checked) # 切换信号(一般在单选框或者复选框中使用) """ app = QApplication(sys.argv) w = QWidget() btn = QPushButton(w) btn.setText("按钮") btn.pressed.connect(lambda: print("鼠标按下了")) # 鼠标按下 btn.released.connect(lambda: print("鼠标释放了")) # 鼠标释放 btn.clicked.connect(lambda value: print("鼠标被点击", value)) # 鼠标被点击 w.show() sys.exit(app.exec_())
1.2 QPushButton
1.2.1 简介
用来给用户点击,来完成某种动作的控件,一般是矩形
1.2.2 创建
QPushButton() # 创建一个无父控件的按钮控件 QPushButton(parent) # 创建控件的同时,设置父控件 QPushButton(text, parent) # 创建控件的同时,设置提示文本的父控件 QPushButton(icon, text, parent) # 创建控件的同时,设置图标和提示文本
1.2.3 菜单
当鼠标点击按钮时,会展开一系列的菜单
#!/usr/bin/env python # -*- coding: UTF-8 -*- # @author: kun from PyQt5.Qt import * import sys """ setMenu(QMenu) # 设置菜单 menu() # 获取菜单 showMenu() # 显示菜单 # QMenu: addMenu(QMenu) # 添加子菜单 addSeparator() # 添加分隔线 addAction(QAction) # 添加行为动作 # QMenu 控件设置 setTitle(str) # 设置标题 setIcon(QIcon) # 设置图标 # QAction 设置 setText(str) # 设置文本内容 setIcon(QIcon) # triggered # 监听行为信号 """ app = QApplication(sys.argv) w = QWidget() btn = QPushButton("File", w) menu = QMenu(btn) # 创建子菜单 open_recent = QMenu(menu) open_recent.setTitle("最近打开") # 添加标题 # open_recent.setIcon() act_n = QAction(QIcon(r"D:\35005\Pictures\Screenshots\微信图片_20220302175157.jpg"), "新建", menu) """ 相当于: act_n = QAction() act_n.setText("新建") act_n.setIcon(QIcon("D:\35005\Pictures\Screenshots\微信图片_20220302175157.jpg")) act_n.setParent(menu) """ act_n.triggered.connect(lambda: print("正在新建文件")) act_o = QAction(QIcon(r"D:\35005\Pictures\Screenshots\微信图片_20220302175157.jpg"), "打开", menu) act_o.triggered.connect(lambda: print("正在打开文件")) act_e = QAction("退出", menu) act_e.triggered.connect(lambda: print("正在退出应用")) act_r = QAction("Python编程", menu) act_r.triggered.connect(lambda: print("正在打开文件")) # 子菜单设置 open_recent.addAction(act_r) # 菜单设置 menu.addAction(act_n) # 添加动作 menu.addAction(act_o) menu.addMenu(open_recent) menu.addSeparator() # 添加分隔线 menu.addAction(act_e) btn.setMenu(menu) w.show() btn.showMenu() # 展示菜单,可以独立展示 sys.exit(app.exec_())
1.2.4 边框
边框是否扁平
#!/usr/bin/env python # -*- coding: UTF-8 -*- # @author: kun from PyQt5.Qt import * import sys app = QApplication(sys.argv) w = QWidget() btn = QPushButton("File", w) print(btn.isFlat()) # 查看边框是否为扁平化 btn.setFlat(True) # 设置扁平化 w.show() sys.exit(app.exec_())
1.2.5 默认处理
#!/usr/bin/env python # -*- coding: UTF-8 -*- # @author: kun from PyQt5.Qt import * import sys app = QApplication(sys.argv) w = QWidget() btn1 = QPushButton("File1", w) btn2 = QPushButton("File2", w) btn2.move(100, 0) btn1.setAutoDefault(True) # 设置为自动默认按钮 print(btn1.autoDefault()) # 打印是否设置自动打印 btn2.setDefault(True) # 一开始就设置为默认 w.show() sys.exit(app.exec_())
在某些GUI样式中,默认按钮被绘制,其周围有一个额外的框架,最多三个像素或更多Qt会自动在自动默认按钮周围保留此空间。即自动默认按钮可能会有稍微大点的提示对于具有QDialog父级的按钮,此属性的默认值为True;否则默认为False
1.2.5 信号
其信号大部分是继承下来的,用法与父类类似
菜单请求信号:
customContextMenuRequested(QPoint)
:自定义上下文菜单请求信号setContextMenuPolicy(Qt.CustomContextMenu)
:设置信号Qt.DefaultContextMenu
:调用对象方法contextMenuEvent()
Qt.CustomContextMenu
:发射信号
#!/usr/bin/env python # -*- coding: UTF-8 -*- # @author: kun from PyQt5.Qt import * import sys class Window(QWidget): def contextMenuEvent(self, evt): # 如果为 Qt.DefaultContextMenu,就会运行这个函数 print("展示菜单") # 右击窗口,会调用这个方法,只要在里面创建菜单就可以了 # 创建对象 menu = QMenu(self) menu_s = QMenu("最近打开", menu) # 创建动作 act_n = QAction(QIcon(r"D:\35005\Pictures\Screenshots\微信图片_20220302175157.jpg"), "新建", menu) act_n.triggered.connect(lambda: print("正在新建文件")) act_o = QAction(QIcon(r"D:\35005\Pictures\Screenshots\微信图片_20220302175157.jpg"), "打开", menu) act_o.triggered.connect(lambda: print("正在打开文件")) act_e = QAction("退出", menu) act_e.triggered.connect(lambda: print("正在退出应用")) act_r = QAction("Python编程", menu) act_r.triggered.connect(lambda: print("正在打开文件")) # 添加动作 menu.addAction(act_n) menu.addAction(act_o) menu.addAction(act_e) menu.addAction(act_r) menu.addMenu(menu_s) # 展示菜单 menu.exec_(evt.globalPos()) # 在鼠标右键的位置打开菜单,参数是窗口坐标 app = QApplication(sys.argv) w = Window() w.resize(500, 500) # Qt.CustomContextMenu,就会发送信号调用此函数 def show_menu(point): print("展示菜单", point) # 创建对象 menu = QMenu(w) menu_s = QMenu("最近打开", menu) # 创建动作 act_n = QAction(QIcon(r"D:\35005\Pictures\Screenshots\微信图片_20220302175157.jpg"), "新建", menu) act_n.triggered.connect(lambda: print("正在新建文件")) act_o = QAction(QIcon(r"D:\35005\Pictures\Screenshots\微信图片_20220302175157.jpg"), "打开", menu) act_o.triggered.connect(lambda: print("正在打开文件")) act_e = QAction("退出", menu) act_e.triggered.connect(lambda: print("正在退出应用")) act_r = QAction("Python编程", menu) act_r.triggered.connect(lambda: print("正在打开文件")) # 添加动作 menu.addAction(act_n) menu.addAction(act_o) menu.addAction(act_e) menu.addAction(act_r) menu.addMenu(menu_s) # 展示菜单 dest_point = w.mapToGlobal(point) # 将坐标转换为全局的坐标 menu.exec_(dest_point) # 在鼠标右键的位置打开菜单,参数是窗口坐标 # w.setContextMenuPolicy(Qt.DefaultContextMenu) # 这个会运行重写的方法 w.setContextMenuPolicy(Qt.CustomContextMenu) # 其不会运行重写的方法,但是会有信号传输 w.customContextMenuRequested.connect(show_menu) # 监测信号 w.show() sys.exit(app.exec_())
1.3 QCommandLinkButton
1.3.1 描述
命令链接是 window vista 引入的新控件
它的用途类似于单选按钮的用途,因为它用于在一组互斥选项之间的选择
命令链接按钮不应单独使用,而应作为向导和对话框中单选按钮的替代选项
外观通常类似于平面按钮的外观,但除了普通按钮文本之外,它还允许描述性文字
继承自QPushButton
1.3.2 语法
#!/usr/bin/env python # -*- coding: UTF-8 -*- # @author: kun from PyQt5.Qt import * import sys app = QApplication(sys.argv) w = QWidget() w.resize(500, 500) btn = QCommandLinkButton("标题", "描述", w) btn.setText("标题文本内容") # 设置标题 print(btn.text()) # 获得标题 btn.setDescription("设置描述内容") # 设置描述 print(btn.description()) # 获得描述 btn.setIcon(QIcon(r"D:\35005\Pictures\Screenshots\微信图片_20220302175157.jpg")) # 设置图标 w.show() sys.exit(app.exec_())
1.4 RadioButton
1.4.1 描述
一般用于给用户提供若干个选项中的单选操作,当选中一个时,会自动取消上一个
当按钮选中时,会有一个圆圈图标,用于标识用户的选中状态
继承自QAbstractButton
1.4.2 功能作用
#!/usr/bin/env python # -*- coding: UTF-8 -*- # @author: kun from PyQt5.Qt import * import sys app = QApplication(sys.argv) w = QWidget() w.resize(500, 500) # 创建,在同一个组或同一个父对象内,值能选择一个,但是如果有r_btn1.setAutoExclusive(False)其可以选择多个(没有排他性) r_btn1 = QRadioButton("男&male", w) # 使用 & 设置快捷键 Alt + m r_btn1.move(100, 0) r_btn1.setChecked(True) # 自动选中 r_btn2 = QRadioButton("女female", w) r_btn2.setShortcut("Alt+F") # 无文本创建快捷键 w.show() sys.exit(app.exec_())
几乎父类的所有方法,子类都可以调用
1.4.3 信号
#!/usr/bin/env python # -*- coding: UTF-8 -*- # @author: kun from PyQt5.Qt import * import sys app = QApplication(sys.argv) w = QWidget() w.resize(500, 500) r_btn1 = QRadioButton("男", w) r_btn1.move(100, 0) r_btn1.setChecked(True) r_btn2 = QRadioButton("女", w) r_btn2.toggled.connect(lambda isChecked: print(isChecked)) # 返回bool,可以得到按钮是否被选中 w.show() sys.exit(app.exec_())
父类的所有信号,子类都可以使用
1.4.4 多组排斥
#!/usr/bin/env python # -*- coding: UTF-8 -*- # @author: kun from PyQt5.Qt import * import sys app = QApplication(sys.argv) w = QWidget() w.resize(500, 500) r_btn1 = QRadioButton("男", w) r_btn1.move(100, 0) r_btn2 = QRadioButton("女", w) # 两组 r_btn3 = QRadioButton("yes", w) r_btn3.move(100, 40) r_btn4 = QRadioButton("no", w) r_btn4.move(0, 40) # 解决方法1:继承不一样的父对象 # 解决方法2:使用按钮组 QButtonGroup g1 = QButtonGroup(w) # 创建 g1.addButton(r_btn1) # 添加按钮 g1.addButton(r_btn2) # 添加按钮 g1.addButton(r_btn3) # 添加按钮 g1.removeButton(r_btn3) # 移除按钮 g2 = QButtonGroup(w) # 创建 g2.addButton(r_btn3) # 添加按钮 g2.addButton(r_btn4) # 添加按钮 w.show() sys.exit(app.exec_())
QButtonGroup:
描述:
- 提供一个抽象的按钮容器,可以将多个按钮划分为一组
- 不具备可视化效果
- 一般放的都是可检查的按钮
- 继承于QObject
功能:
#!/usr/bin/env python # -*- coding: UTF-8 -*- # @author: kun from PyQt5.Qt import * import sys app = QApplication(sys.argv) w = QWidget() w.resize(500, 500) r_btn1 = QRadioButton("男", w) r_btn1.move(100, 0) r_btn2 = QRadioButton("女", w) r_btn2.setChecked(True) # id以及创建 g1 = QButtonGroup(w) # 创建 g1.addButton(r_btn1, 1) # 添加按钮,同时设置id为1,系统自动分配的id为负值 g1.addButton(r_btn2, 2) # 添加按钮,同时设置id为2 print(g1.button(1)) # 查看 id 为 1 的按钮 # 手动绑定id g1.setId(r_btn1, 2) g1.setId(r_btn2, 1) print(g1.id(r_btn1)) # 查看指定按钮的id print(g1.checkedId()) # 获取选中的按钮的id,如果都没选中,则为-1 # 按钮操作 # g1.removeButton(r_btn2) # 移除按钮 print(g1.buttons()) # 查看组内有哪些按钮 print(g1.button(1)) # 查看 id 为 1 的按钮 print(g1.checkedButton().text()) # 查看选中的按钮 # 独占设置 g1.setExclusive(False) # 取消组内的互斥关系 print(g1.exclusive()) # 获取组内是否有互斥关系 w.show() sys.exit(app.exec_()) 信号使用
buttonClicked(int / QAbstractButton) # 当组内的按钮点击时,发射此信号 buttonPressed(int / QAbstractButton) # 当组内的按钮按下时,发射此信号 buttonReleased(int / QAbstractButton) # 当组内的按钮松开时,发射此信号 buttonToggled(int / QAbstractButton) # 当组内的按钮切换状态时,发射此信号 # 比如 g1.buttonToggled[int].connect(lambda val: print(val)) 注意:
- 通过buttonToggle[int].connect(fn) :来获取指定响应返回类型的信号,int 为按钮的 id 值
- 如果一个对象向外界提供的信号名称一样,但参数不一样;外界在使用信号时,可以使用如下格式进行选择
signal_name[type]
1.5 QCheckButton
1.5.1 描述
一般用于给用户提供若干个选项中的多选操作,可以都选;也可以都不选
左侧会有一个方框图标,标识用户的选中状态
继承自QAbstractButton
1.5.2 功能作用
#!/usr/bin/env python # -*- coding: UTF-8 -*- # @author: kun from PyQt5.Qt import * import sys app = QApplication(sys.argv) w = QWidget() w.resize(500, 500) bc = QCheckBox("python", w) # 创建复选框对象 bc.setIcon(QIcon(r"D:\35005\Pictures\Screenshots\微信图片_20220302175157.jpg")) # 设置图标 # 其可以继承父类的操作 # 设置是否三态 bc.setTristate(True) # 开启三态 print(bc.isTristate()) # 查看是否开启三态 # 设复选框状态 bc.setCheckState(Qt.PartiallyChecked) # 部分选中 print(bc.checkState()) # 查看选中状态 w.show() sys.exit(app.exec_())
复选框的状态:
Qt.Unchecked
:该项目未选中 0Qt.PartiallyChecked
:部分选中 1Qt.Checked
:全部选中 2
1.5.3 信号
stateChanged(int state) # 选中或清除选中时,发射此信号
其他的信号都是通过继承而来
1.6 QToolButton
1.6.1 描述
提供了一个快速访问按钮
通常是在工具栏内部使用
工具按钮通常不显示文本标签,而是显示图标,如保存文件的图标
继承自QAbstractButton
1.6.2 功能作用
1.6.2.1 创建
#!/usr/bin/env python # -*- coding: UTF-8 -*- # @author: kun from PyQt5.Qt import * import sys app = QApplication(sys.argv) w = QWidget() w.resize(500, 500) btn = QToolButton(w) # 创建一个按钮 btn.setIcon(QIcon(r"D:\35005\Pictures\Screenshots\微信图片_20220302175157.jpg")) # 添加图标 btn.setIconSize(QSize(100, 100)) # 设置图标大小 btn.setText("xxx") # 设置文本,如果有图标又有文本,那么默认显示图标 btn.setToolTip("这是一个工具栏按钮") # 设置提示 btn.setToolButtonStyle(Qt.ToolButtonTextUnderIcon) # 改变按钮风格,文本显示在图标下方,其他类型的风格可以在官方文档或者源码中查看 print(btn.toolButtonStyle()) # 获得按钮风格取值 w.show() sys.exit(app.exec_())
1.6.2.2 自动提升
#!/usr/bin/env python # -*- coding: UTF-8 -*- # @author: kun from PyQt5.Qt import * import sys app = QApplication(sys.argv) w = QWidget() w.resize(500, 500) btn = QToolButton(w) btn.setArrowType(Qt.UpArrow) # 设置向上的箭头,其他的请到官方文档或源码中查找,在设置箭头后,以前设置的图标将被覆盖 print(btn.arrowType()) # 获取箭头类型 btn.setAutoRaise(True) # 设置自动提升,类似于setFlat() print(btn.autoRaise()) # 获取是否开启自动提升效果 w.show() sys.exit(app.exec_())
1.6.2.3 菜单按钮
#!/usr/bin/env python # -*- coding: UTF-8 -*- # @author: kun from PyQt5.Qt import * import sys app = QApplication(sys.argv) w = QWidget() w.resize(500, 500) btn = QToolButton(w) btn.setArrowType(Qt.DownArrow) # 创建一个向下的箭头 btn.setText("工具栏") btn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) menu = QMenu(btn) sub_menu = QMenu("子菜单", menu) # 创建动作 act = QAction(QIcon(r"D:\35005\Pictures\Screenshots\微信图片_20220302175157.jpg"), "行为", menu) act.triggered.connect(lambda: print("正在执行行为")) # 设置子菜单 sub_menu.setIcon(QIcon(r"D:\35005\Pictures\Screenshots\微信图片_20220302175157.jpg")) # 设置主菜单 menu.addAction(act) menu.addMenu(sub_menu) btn.setMenu(menu) # 注意,默认的菜单弹出方式为,按住按钮一会儿才会弹出菜单 QToolButton.DelayedPopup btn.setPopupMode(QToolButton.MenuButtonPopup) # 有一个专门的指示箭头,点击箭头展示 # btn.setPopupMode(QToolButton.InstantPopup) # 点了按钮就弹出,其会影响信号的发射 print(btn.popupMode()) # 获得菜单弹出方式 w.show() sys.exit(app.exec_())
1.6.3 信号
#!/usr/bin/env python # -*- coding: UTF-8 -*- # @author: kun from PyQt5.Qt import * import sys app = QApplication(sys.argv) w = QWidget() w.resize(500, 500) btn = QToolButton(w) btn.setArrowType(Qt.LeftArrow) btn.setText("工具栏") btn.setToolButtonStyle(Qt.ToolButtonTextBesideIcon) menu = QMenu(btn) sub_menu = QMenu("子菜单", menu) # 创建动作 act = QAction(QIcon(r"D:\35005\Pictures\Screenshots\微信图片_20220302175157.jpg"), "行为", menu) act.triggered.connect(lambda: print("正在执行行为")) act.setData([1, 2, 3]) # 行为可以传递数据 # 设置子菜单 sub_menu.setIcon(QIcon(r"D:\35005\Pictures\Screenshots\微信图片_20220302175157.jpg")) # 设置主菜单 menu.addAction(act) menu.addMenu(sub_menu) btn.triggered.connect(lambda act: print("按钮发送信号", act.data())) # 单点击菜单时,也会触发这个槽,同时可以获取到哪个行为触发了这个槽,act.data() 可以接收行为设置的数据,可以对不同额行为,绑定不同的数据,在出口对数据进行操作 btn.setMenu(menu) btn.setPopupMode(QToolButton.MenuButtonPopup) w.show() sys.exit(app.exec_())
本文来自博客园,作者:Kenny_LZK,转载请注明原文链接:https://www.cnblogs.com/liuzhongkun/p/16074588.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?