1、QPushButton()的特定功能:菜单的设置,当我们点击按钮时,会显示一系列的下拉菜单。
2、当用户点击行为会像外界会发出信号。
import sys
from PyQt5.Qt import *
app = QApplication(sys.argv)
window = QWidget()
btn = QPushButton("xxx", window)
# 菜单的设置
# 首先创建一个menu对象
menu = QMenu()
# menu后可以添加行为、分割线、图标、子菜单等,可以进入类中查看方法
# 子菜单 最近打开
# 行为动作 新建 打开 分割线 退出
# 方案一
# new_action = QAction()
# new_action.setText("新建")
# 方案二
new_action = QAction("新建", menu)
# 监听行为的信号
new_action.triggered.connect(lambda: print("新建文件"))
open_action = QAction("打开", menu)
open_action.triggered.connect(lambda: print("打开文件"))
exit_action = QAction("退出", menu)
exit_action.triggered.connect(lambda:print("退出文件"))
# 子菜单
oprn_recent_menu = QMenu(menu)
oprn_recent_menu.setTitle("最近打开")
file_action = QAction("python-pyqt")
oprn_recent_menu.addAction(file_action)
menu.addAction(new_action)
menu.addAction(open_action)
menu.addSeparator()
menu.addMenu(oprn_recent_menu)
menu.addAction(exit_action)
# 给按钮后添加菜单
btn.setMenu(menu)
# 菜单的获取
print(btn.menu())
window.setWindowTitle("按钮的功能")
window.resize(500, 500)
window.show()
# 菜单的显示
menu.show()
sys.exit(app.exec_())
3、边框扁平化:直接调用setFlat(bool)方法。当按钮设置为扁平状,则其没有背景颜色。
btn.setStyleSheet("background-color: red")
# 将按钮设置为扁平状
btn.setFlat(True)
4、默认按钮的处理:(主要应用)
例如:打开按钮被设置为默认的(带蓝色边框);
自动设置为默认按钮和设置为默认按钮的区别:
# 将按钮设置为自动默认按钮
# 只有当按钮被点击一次之后,他才会是默认按钮
btn.setAutoDefault(True)
print(btn.autoDefault())
# 不需要点击该按钮,一直是自动默认按钮
btn.setDefault(True)
5、右键菜单:通过不同的信号监听不同的消息,做出不同的反应。
右键菜单:当用户点击右键所弹出的菜单。点击右键之后会默认调用contextMenuEvent()对象方法。需要重写该方法,可以在这个方法中调用菜单。
将菜单展示在某一个指定位置(给定一个点),需要获取鼠标点击的相对于全局的坐标位置。将局部坐标映射到全局坐标:mapToGlobal()。
import sys
from PyQt5.Qt import *
class Window(QWidget):
def contextMenuEvent(self, ContextMenuEvent):
print("调用菜单")
# 菜单的设置
# 首先创建一个menu对象
menu = QMenu(self)
new_action = QAction("新建", menu)
# 监听行为的信号
new_action.triggered.connect(lambda: print("新建文件"))
open_action = QAction("打开", menu)
open_action.triggered.connect(lambda: print("打开文件"))
exit_action = QAction("退出", menu)
exit_action.triggered.connect(lambda: print("退出文件"))
# 子菜单
oprn_recent_menu = QMenu(menu)
oprn_recent_menu.setTitle("最近打开")
file_action = QAction("python-pyqt")
oprn_recent_menu.addAction(file_action)
menu.addAction(new_action)
menu.addAction(open_action)
menu.addSeparator()
menu.addMenu(oprn_recent_menu)
menu.addAction(exit_action)
menu.exec_(ContextMenuEvent.globalPos())
app = QApplication(sys.argv)
window = Window()
btn = QPushButton("xxx", window)
btn.setStyleSheet("background-color: red")
window.setWindowTitle("按钮的功能")
window.resize(500, 500)
def show_menu(point):
menu = QMenu(window)
new_action = QAction("新建", menu)
# 监听行为的信号
new_action.triggered.connect(lambda: print("新建文件"))
open_action = QAction("打开", menu)
open_action.triggered.connect(lambda: print("打开文件"))
exit_action = QAction("退出", menu)
exit_action.triggered.connect(lambda: print("退出文件"))
# 子菜单
oprn_recent_menu = QMenu(menu)
oprn_recent_menu.setTitle("最近打开")
file_action = QAction("python-pyqt")
oprn_recent_menu.addAction(file_action)
menu.addAction(new_action)
menu.addAction(open_action)
menu.addSeparator()
menu.addMenu(oprn_recent_menu)
menu.addAction(exit_action)
# 使用映射的方法将局部坐标点转换为全局点
dest_point = window.mapToGlobal(point)
menu.exec_(dest_point)
# 自定义上下文菜单,会发射一个信号
window.setContextMenuPolicy(Qt.CustomContextMenu)
window.customContextMenuRequested.connect(show_menu)
window.show()
sys.exit(app.exec_())
addSeparator()添加分割线函数。