QPushButton普通按钮
- 描述:用来给用户点击, 来完成某种动作的控件。一般是矩形
- 例如:登录按钮、注册按钮、关闭按钮、是、否......
- 继承:QAbstractButton
- 功能作用
- 创建按钮控件
- 快捷键设置
- 菜单
- 边框是否保持扁平
- 默认处理
- 可用信号
- 继承自QAbstractButton的信号
- 继承自QWidget的信号
- 创建按钮控件
QPushButton() # 创建一个无父控件的按钮控件 QpushButton(parent) # 创建控件的同时设置父控件 QpushButton(text, parent) # 创建控件的同时, 设置提示文本和父控件 QpushButton(icon, text, parent) # 创建控件的同时, 设置图标, 提示文本和父控件
- 快捷键设置
# 设置英文文本时, 使用&符号 QPushButton("&Sz", window) # 创建对象的同时设置提示文本的时候设置快捷键 setText("&Sz") # 设置提示文本的时候设置快捷键 setShortcut("Alt+G") # 继承QAbstractButton类,设置控件快捷键
- 菜单设置
- 菜单:按钮右侧出现倒三角符号,鼠标点击按钮后,会出现下拉菜单
- 下拉菜单中又分为三种类型:行为动作、分割线、子菜单
- 行为动作:点击后直接执行某种动作。如:新建、打开、关闭
- 子菜单:鼠标滑上去或者点击后,再次弹出二级菜单
- 分割线:用于组与组之间的分隔
- 需要先创建菜单对象(QMenu),然后将这个菜单对象设置给按钮
- 子菜单原理也是一样。先创建一个菜单对象(QMenu),再将这个菜单设置给子菜单
setMenu(QMenu) # 按钮设置菜单,添加一个QMenu对象 menu() # 获取菜单对象 showMenu() # 展示菜单(无需鼠标点击按钮,自动展开菜单) # 关于QMenu控件 addAction(QAction) # 添加行为动作 addMenu(QMenu) # 添加子菜单 addSeparator() # 添加分割线 setTitle(str) # 设置标题 setIcon(QIcon) # 设置图标 # 关于QAction控件(行为动作) setText(str) # 设置提示文本 setIcon(QIcon) # 设置图标 信号:triggered # 鼠标点击行为动作触发该事件
- 边框是否保持扁平
- 设置了此属性,则除非按下按钮,否则大多数样式都不会绘制按钮背景
setFlat(bool) # 设置边框是否保持扁平,默认值为False isFlat() # 获取当前按钮边框是否扁平
- 默认处理
- 个人理解:setDefault、setAutoDefault 设置按钮是否对回车键按下事件有响应
- setDefault、setAutoDefault的区别:
- setDefault不管按钮是否选中都有附加框架
- setAutoDefault 按钮在选中状态下才有附加框架,取消选中后附加框架消失
- default、atuoDefault属性仅在父窗口为对话窗才生效,其他窗口类型设置这两个属性没有意义;
- 按钮的按压触发除了鼠标键之外,也可以使用回车键和空格键触发,这两个属性正是控制回车键和空格键按下时按钮的响应行为
setAutoDefault(bool) # 设置为自动默认按钮(选中状态才会显示一个附加框架) # 在某些GUI样式中,默认按钮被绘制,其周围有一个额外的框架,最多3个像素或更多 # Qt会自动在自动默认按钮周围保留此空间,即自动默认按钮可能会有稍大的提示 # 对于具有QDialog父级的按钮,此属性的默认值为true ; 否则默认为false autoDefault() # 获取是否设置为自动默认 setDefault(bool) # 设置按钮的默认状态(默认按钮将一直显示一个附加的框架(取决于gui样式)) isDefault() # 获取是否设置按钮的默认状态
- 个人理解
- QPushButton按钮默认按下回车键按下无响应(即使是选中状态也不响应),按下空格键有响应(选中状态时)
- QPushButton按钮设置
setDefault(True)
和setAutoDefault(True)
后,按下回车键会响应(选中状态),按下空格键也有响应(选中状态) - 设置
setDefault(True)
后,按钮会一直保持显示一个附加框架(蓝色框架) - 设置
setAutoDefault(True)
后,按钮被选中时会显示一个附加框架(蓝色框架)
- 可用信号
# 继承自QAbstractButton类 pressed() # 鼠标按下信号 released() # 鼠标释放信号(控件内松开鼠标/鼠标移出控件范围后) clicked(checked = False) # 单击信号(控件内按下+控件内释放),传递按钮是否被选中状态 toffled(bool checked) # 选中状态切换信号(一般在单选框或者复选框中使用),传递按钮是否被选中状态 # 继承自QWidget类 windowTitleChanged(QString) # 窗口标题改变信号,发射新的窗口名称 windowIconChanged(QIcon) # 窗口图标改变信号,发射图标对象 customContextMenuRequested(QPoint) # 自定义上下文菜单请求信号(鼠标右键按下发射信号),发射(传递)鼠标右键点击的坐标 setContextMenuPolicy(Qt.CustomContextMenu) # 设置控件自定义上下文菜单策略 # 参数: Qt.CustomContextMenu # 发射信号customContextMenuRequested(QPoint) Qt.DefaultContextMenu # 默认,调用对象方法contextMenuEvent()
-
示例代码
-
案例1:创建按钮控件
from PyQt5.Qt import * import sys app = QApplication(sys.argv) window = QWidget() window.resize(500, 500) window.setWindowTitle('QPushButton功能作用') # 方法一:创建无父控件按钮 btn1 = QPushButton() btn1.setParent(window) btn1.setText('按钮1') btn1.setIcon(QIcon("../ico/logo.ico")) btn1.move(100, 50) # 方法二:创建控件的同时设置父控件 btn2 = QPushButton(window) btn2.setText('按钮2') btn2.setIcon(QIcon("../ico/logo.ico")) btn2.move(100, 100) # 方法三:创建控件的同时, 设置提示文本和父控件 btn3 = QPushButton('按钮3', window) btn3.setIcon(QIcon("../ico/logo.ico")) btn3.move(100, 150) # 方法四:创建控件的同时, 设置图标, 提示文本和父控件 btn4 = QPushButton(QIcon("../ico/logo.ico"), '按钮4', window) btn4.move(100, 200) window.show() sys.exit(app.exec_())
-
案例2:按钮快捷键设置
from PyQt5.Qt import * import sys app = QApplication(sys.argv) window = QWidget() window.resize(500, 500) window.setWindowTitle('QPushButton快捷键设置') # 方法一 btn1 = QPushButton('&Fz', window) btn1.move(200, 100) # 方法二 btn2 = QPushButton(window) btn2.setText('A&BC') btn2.move(300, 100) # 方法三 btn3 = QPushButton('按钮3', window) btn3.move(100, 100) btn3.setShortcut('ALT+H') btn1.clicked.connect(lambda :print('Fz:Fz Hello')) btn2.clicked.connect(lambda :print('ABC:Fz Hello')) btn3.clicked.connect(lambda :print('按钮3:Fz Hello')) window.show() sys.exit(app.exec_())
-
案例3:按钮菜单设置
from PyQt5.Qt import * import sys app = QApplication(sys.argv) window = QWidget() window.resize(500, 500) window.setWindowTitle('QPushButton-菜单') btn = QPushButton('按钮菜单', window) btn.move(20, 10) # 创建菜单对象 menu = QMenu('菜单', btn) # 创建动作行为对象用于主菜单 act1 = QAction('新建', menu) act2 = QAction('打开', menu) act3 = QAction('保存', menu) act4 = QAction('退出', menu) # 添加快捷键 act1.setShortcut('Alt+Insert') act3.setShortcut('Ctrl+S') # 主菜单行为动作添加信号与槽关联 act1.triggered.connect(lambda : print('新建文件')) act2.triggered.connect(lambda : print('打开文件')) act3.triggered.connect(lambda : print('保存文件')) act4.triggered.connect(lambda : print('退出程序')) # 给行为动作添加图标 act1.setIcon(QIcon('../images/new.jpg')) act2.setIcon(QIcon('../images/open.jpg')) act3.setIcon(QIcon('../images/save.jpg')) act4.setIcon(QIcon('../images/exit.jpg')) # 创建子菜单 me = QMenu('最近使用...', menu) # me.setIcon(QIcon('../images/exit.jpg')) # 创建动作行为对象用于主菜单 ac1 = QAction('01_QPushButton-功能作用.py', me) ac2 = QAction('02_QPushButton-快捷键设置.py', me) ac3 = QAction('03_QPushButton-菜单.py', me) # 给二级菜单行为动作添加图标 ac3.setIcon(QIcon('../images/edit.jpg')) # 子菜单行为动作添加信号与槽关联 ac1.triggered.connect(lambda : print('打开文件:' + ac1.text())) ac2.triggered.connect(lambda : print('打开文件:' + ac2.text())) ac3.triggered.connect(lambda : print('打开文件:' + ac3.text())) # 子菜单添加项目:行为动作 me.addAction(ac1) me.addAction(ac2) me.addAction(ac3) # 给菜单添加项目:行为动作 menu.addAction(act1) menu.addAction(act2) menu.addAction(act3) # 给菜单添加项目:分割线 menu.addSeparator() # 给菜单添加项目:子菜单 menu.addMenu(me) # 给菜单添加项目:分割线 menu.addSeparator() menu.addAction(act4) # 按钮设置菜单 btn.setMenu(menu) window.show() sys.exit(app.exec_())
-
-
案例4:默认设置
from PyQt5.Qt import * import sys import time class Btn(QPushButton): def keyPressEvent(self, a0) -> None: super().keyPressEvent(a0) if a0.key() == 32: self.parent().findChild(QLabel, 'labe0').setText('空格键被按下了') elif a0.key() == 16777220: self.parent().findChild(QLabel, 'labe0').setText('回车键被按下了') def keyReleaseEvent(self, e) -> None: super().keyReleaseEvent(e) self.parent().findChild(QLabel, 'labe').setText('') self.parent().findChild(QLabel, 'labe0').setText('') def cao(self): labe.setText(self.text() + '被点击了') app = QApplication(sys.argv) window = QWidget() window.resize(500, 500) window.setWindowTitle('QPushButton-默认设置') labe = QLabel(window) labe.resize(300, 50) labe.setObjectName('labe') labe.move(100, 410) labe.setStyleSheet("font-size:40px;color:red;border: 1px solid gray;") labe0 = QLabel(window) labe0.setObjectName('labe0') labe0.resize(300, 50) labe0.move(100, 350) labe0.setStyleSheet("font-size:40px;color:green;border: 1px solid gray;") labe1 = QLabel('默认状态', window) labe1.move(50, 70) labe2 = QLabel('setDefault(True)', window) labe2.move(50, 170) labe3 = QLabel('setAutoDefault(True)', window) labe3.move(50, 270) btn1 = Btn('按钮1', window) btn2 = Btn('按钮2', window) btn3 = Btn('按钮3', window) btn4 = Btn('按钮4', window) btn5 = Btn('按钮5', window) btn6 = Btn('按钮6', window) btn7 = Btn('按钮7', window) btn8 = Btn('按钮8', window) btna = Btn('按钮A', window) btnb = Btn('按钮B', window) btnc = Btn('按钮C', window) btnd = Btn('按钮D', window) btn1.move(50, 100) btn2.move(150, 100) btn3.move(250, 100) btn4.move(350, 100) btn5.move(50, 200) btn6.move(150, 200) btn7.move(250, 200) btn8.move(350, 200) btna.move(50, 300) btnb.move(150, 300) btnc.move(250, 300) btnd.move(350, 300) btn1.pressed.connect(btn1.cao) btn2.pressed.connect(btn2.cao) btn3.pressed.connect(btn3.cao) btn4.pressed.connect(btn4.cao) btn5.pressed.connect(btn5.cao) btn6.pressed.connect(btn6.cao) btn7.pressed.connect(btn7.cao) btn8.pressed.connect(btn8.cao) btna.pressed.connect(btna.cao) btnb.pressed.connect(btnb.cao) btnc.pressed.connect(btnc.cao) btnd.pressed.connect(btnd.cao) # 设置按钮默认响应回车键按下事件,按钮一直保持显示附加框架 btn5.setDefault(True) btn6.setDefault(True) btn7.setDefault(True) btn8.setDefault(True) # 设置按钮自动默认响应回车键按下事件,按钮选中时显示附加框架 btna.setAutoDefault(True) btnb.setAutoDefault(True) btnc.setAutoDefault(True) btnd.setAutoDefault(True) window.show() sys.exit(app.exec_())
-
-
案例5:可用信号
- 控件设置上下文请求(鼠标右键)策略为默认(setContextMenuPolicy(Qt.DefaultContextMenu))
- 上下文请求(鼠标右键)策略为默认时,调用对象方法contextMenuEvent()
from PyQt5.Qt import * import sys class Window(QWidget): def contextMenuEvent(self, a0) -> None: menu = self.createMenu() x_y = a0.globalPos() # menu.move(x_y) # menu.show() menu.exec_(QPoint(x_y)) def createMenu(self): menu = QMenu('主菜单', self) act1 = QAction('查看', menu) act2 = QAction('新建', menu) act3 = QAction('刷新', menu) act4 = QAction('打印', menu) me = QMenu('子菜单', menu) ac1 = QAction('子菜单1', me) ac2 = QAction('子菜单2', me) ac3 = QAction('子菜单3', me) ac4 = QAction('子菜单4', me) me.addAction(ac1) me.addAction(ac2) me.addAction(ac3) me.addAction(ac4) menu.addAction(act1) menu.addAction(act2) menu.addAction(act3) menu.addSeparator() menu.addMenu(me) menu.addAction(act4) return menu app = QApplication(sys.argv) window = Window() window.resize(500, 500) window.setWindowTitle('QPushButton-可用信号') # ****************这些信号前面都讲了,这里就不写了****************** 开始 # 继承自QAbstractButton类 # pressed() # 鼠标按下信号 # released() # 鼠标释放信号(控件内松开鼠标/鼠标移出控件范围后) # clicked(checked=False) # 单击信号(控件内按下+控件内释放),传递按钮是否被选中状态 # toffled(bool checked) # 选中状态切换信号(一般在单选框或者复选框中使用),传递按钮是否被选中状态 # 继承自QWidget类 # windowTitleChanged(QString) # 窗口标题改变信号 # windowIconChanged(QIcon) # 窗口图标改变信号 # ****************这些信号前面都讲了,这里就不写了****************** 结束 # ****************自定义上下文菜单请求信号****************** 开始 # customContextMenuRequested(QPoint) # 自定义上下文菜单请求信号 # setContextMenuPolicy(参数) # 设置控件自定义上下文策略 # 参数: # Qt.DefaultContextMenu # 默认,调用对象方法contextMenuEvent() # Qt.CustomContextMenu # 发射信号customContextMenuRequested(QPoint) # ****************自定义上下文菜单请求信号****************** 结束 window.show() sys.exit(app.exec_())
-
案例6:可用信号
- 控件设置上下文请求(鼠标右键)策略为setContextMenuPolicy(Qt.CustomContextMenu)
- 上下文请求(鼠标右键)策略设置为 Qt.CustomContextMenu 时,鼠标右键点击时候会发射信号customContextMenuRequested(QPoint)
from PyQt5.Qt import * import sys class Window(QWidget): def contextMenuEvent(self, a0) -> None: menu = self.createMenu() x_y = a0.globalPos() # menu.move(x_y) # menu.show() menu.exec_(QPoint(x_y)) def createMenu(self): menu = QMenu('主菜单', self) act1 = QAction('查看', menu) act2 = QAction('新建', menu) act3 = QAction('刷新', menu) act4 = QAction('打印', menu) me = QMenu('子菜单', menu) ac1 = QAction('子菜单1', me) ac2 = QAction('子菜单2', me) ac3 = QAction('子菜单3', me) ac4 = QAction('子菜单4', me) me.addAction(ac1) me.addAction(ac2) me.addAction(ac3) me.addAction(ac4) menu.addAction(act1) menu.addAction(act2) menu.addAction(act3) menu.addSeparator() menu.addMenu(me) menu.addAction(act4) return menu app = QApplication(sys.argv) window = QWidget() window.resize(500, 500) window.setWindowTitle('QPushButton-可用信号') # 设置控件上下文请求策略(鼠标右键请求策略)为Qt.CustomContextMenu # 此时上下文请求会发射信号 window.setContextMenuPolicy(Qt.CustomContextMenu) def rig_cao(pos): menu = QMenu('主菜单', window) act1 = QAction('查看', menu) act2 = QAction('新建', menu) act3 = QAction('刷新', menu) act4 = QAction('打印', menu) me = QMenu('子菜单', menu) ac1 = QAction('子菜单1', me) ac2 = QAction('子菜单2', me) ac3 = QAction('子菜单3', me) ac4 = QAction('子菜单4', me) me.addAction(ac1) me.addAction(ac2) me.addAction(ac3) me.addAction(ac4) menu.addAction(act1) menu.addAction(act2) menu.addAction(act3) menu.addSeparator() menu.addMenu(me) menu.addAction(act4) # 将控件中的坐标映射成桌面坐标 desk_pos = window.mapToGlobal(pos) menu.exec_(QPoint(desk_pos)) window.customContextMenuRequested.connect(rig_cao) window.show() sys.exit(app.exec_())