QpushButton菜单设置 和 右键菜单
2023-12-22 01:12:51
一、前言
? 在PyQt中,可以通过QMenu
和QAction
类来创建和管理菜单。QMenu
用于定义具体的菜单,而QAction
则代表菜单中的具体操作项。
二、点击QPushButton,显示菜单
-
API
-
QPushButton操作菜单的相关Api
-
QMenu自身相关Api
-
-
代码演示
- 代码:
from PyQt5.Qt import * import sys app = QApplication(sys.argv) window = QWidget() window.setWindowTitle("测试按钮菜单") window.resize(500, 500) btn = QPushButton() btn.setParent(window) btn.setText("测试菜单按钮") btn.setIcon(QIcon("菜单.png")) # *************菜单的设置***************开始 # 创建一个菜单实例,该菜单将与按钮关联 menu = QMenu(window) # 创建一个新的 QAction 实例,代表"新建"操作 new_action = QAction(QIcon("新建.png"), "新建", menu) new_action.triggered.connect(lambda :print("新建文件")) open_action = QAction(QIcon("打开.png"), "打开", menu) open_action.triggered.connect(lambda :print("打开文件")) exit_action = QAction("退出", menu) exit_action.triggered.connect(lambda :print("退出程序")) # 创建一个子菜单实例,用于存储最近打开的文件 open_recent_menu = QMenu(menu) # 设置子菜单的标题 open_recent_menu.setTitle("最近打开") # 创建一个新的 QAction 实例,代表"最近的文件" file_action = QAction("最近的文件") # 将各个操作添加到菜单中 menu.addAction(new_action) menu.addAction(open_action) open_recent_menu.addAction(file_action) # 将子菜单添加到主菜单中 menu.addMenu(open_recent_menu) # 添加一个分隔线,以区分不同的操作组 menu.addSeparator() menu.addAction(exit_action) # 将菜单设置为按钮的关联菜单 btn.setMenu(menu) # *************菜单的设置***************结束 window.show() sys.exit(app.exec_())
-
结果:
三、右键菜单
-
API
-
右键事件继承自 QWidget,Api如下图所示:
如图所示,右键菜单有两种方式:
-
继承QWidget,重写 contextMenuEvent 方法,在方法中实现menu的创建即可;
-
控件类设置右键菜单策略为自定义:
your_window.setContextMenuPolicy(Qt.CustomContextMenu)
然后定义上下文菜单的请求信号槽函数,在槽函数中创建菜单:
your_window.customContextMenuRequested.connect(your_slot)
-
-
-
代码演示
-
方式一,继承QWidget,重写 contextMenuEvent 方法,代码:
from PyQt5.Qt import * import sys class Window(QWidget): def contextMenuEvent(self, event) -> None: print("上下文菜单调用方法") # *************菜单的设置***************开始 # 创建一个菜单实例,该菜单将与按钮关联 menu = QMenu(window) # 创建一个新的 QAction 实例,代表"新建"操作 new_action = QAction(QIcon("新建.png"), "新建", menu) new_action.triggered.connect(lambda: print("新建文件")) open_action = QAction(QIcon("打开.png"), "打开", menu) open_action.triggered.connect(lambda: print("打开文件")) exit_action = QAction("退出", menu) exit_action.triggered.connect(lambda: print("退出程序")) # 创建一个子菜单实例,用于存储最近打开的文件 open_recent_menu = QMenu(menu) # 设置子菜单的标题 open_recent_menu.setTitle("最近打开") # 创建一个新的 QAction 实例,代表"最近的文件" file_action = QAction("最近的文件") # 将各个操作添加到菜单中 menu.addAction(new_action) menu.addAction(open_action) open_recent_menu.addAction(file_action) # 将子菜单添加到主菜单中 menu.addMenu(open_recent_menu) # 添加一个分隔线,以区分不同的操作组 menu.addSeparator() menu.addAction(exit_action) # 在鼠标点击的位置显示菜单 menu.exec_(event.globalPos()) # *************菜单的设置***************结束 app = QApplication(sys.argv) window = Window() window.setWindowTitle("测试右键菜单") window.resize(500, 500) window.show() sys.exit(app.exec_())
-
方式二,控件类设置右键菜单策略为自定义,代码:
from PyQt5.Qt import * import sys def get_menu(point) -> None: print("上下文菜单调用方法") # *************菜单的设置***************开始 # 创建一个菜单实例,该菜单将与按钮关联 menu = QMenu(window) # 创建一个新的 QAction 实例,代表"新建"操作 new_action = QAction(QIcon("新建.png"), "新建", menu) new_action.triggered.connect(lambda: print("新建文件")) open_action = QAction(QIcon("打开.png"), "打开", menu) open_action.triggered.connect(lambda: print("打开文件")) exit_action = QAction("退出", menu) exit_action.triggered.connect(lambda: print("退出程序")) # 创建一个子菜单实例,用于存储最近打开的文件 open_recent_menu = QMenu(menu) # 设置子菜单的标题 open_recent_menu.setTitle("最近打开") # 创建一个新的 QAction 实例,代表"最近的文件" file_action = QAction("最近的文件") # 将各个操作添加到菜单中 menu.addAction(new_action) menu.addAction(open_action) open_recent_menu.addAction(file_action) # 将子菜单添加到主菜单中 menu.addMenu(open_recent_menu) # 添加一个分隔线,以区分不同的操作组 menu.addSeparator() menu.addAction(exit_action) # 在全局坐标系下转换点的位置并显示菜单 dest_point = window.mapToGlobal(point) #point是相对桌面的绝对位置,转换为相对父控件的位置 menu.exec_(dest_point) # *************菜单的设置***************结束 app = QApplication(sys.argv) window = QWidget() window.setWindowTitle("测试右键菜单") window.resize(500, 500) # 设置窗口的上下文菜单策略为自定义,并连接自定义右键菜单请求信号到处理函数 window.setContextMenuPolicy(Qt.CustomContextMenu) window.customContextMenuRequested.connect(get_menu) #传入一个相对桌面的绝对位置 window.show() sys.exit(app.exec_())
注意:customContextMenuRequested会给槽函数传入一个相对桌面的绝对位置,需要在槽函数中转换为相对父控件的位置再进行使用。
-
结果
-
总结
? 注意掌握菜单的创建 和 action 的添加,以及 按钮点击显示菜单 和 右键显示菜单 的两种方式。
文章来源:https://blog.csdn.net/CAUC_lin/article/details/135141805
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!