使用pyqt5时右键菜单 QAction信号的问题

本文介绍了在使用PyQT5创建右键菜单时遇到的Action槽函数连接问题。作者指出,使用`exec_()`或`exec()`会导致槽函数连接错误,而应该使用`popup()`方法。同时,展示了如何正确连接槽函数,以及在需要传递参数时使用lambda表达式的方法。通过这个例子,读者可以了解PyQT5中菜单操作和信号槽机制的正确用法。
摘要由CSDN通过智能技术生成

在使用pyqt5 写右键菜单是,Action的槽函数和信号连接出现了问题。

# 创建右键菜单    
def show_context_menu(self):
        self.context_menu = QMenu(self)
        self.add_action = QAction("新增")
        self.delete_action = QAction("删除")
        self.context_menu.addAction(self.add_action)
        self.context_menu.addAction(self.delete_action)
        # 声明当鼠标在groupBox控件上右击时,在鼠标位置显示右键菜单只能用popup,exec/exec_两个都不行
        self.context_menu.exec(QCursor.pos())
        # 选中行数/列数
        select_size = len(self.tableView.selectionModel().selection().indexes())
        print("选中行数:" + str(select_size))
        for index in self.tableView.selectionModel().selection().indexes():
            row, column = index.row(), index.column()
            print(f"当前选中第{row},第{column}列")
        self.add_action.triggered.connect(self.add_service())
        self.delete_action.triggered.connect(self.remove_service)

需要注意的是 

self.context_menu.exec(QCursor.pos()) 代码。self.context_menu 有 exec/exec_/popup 方法

如果使用exec/exec_ 则后面的连接函数(槽函数)需要加括号,且槽函数需要加括号。否则槽函数不执行,然而槽函数会连接两次。最终报错如下

Traceback (most recent call last):
  File "C:\Users\yingxu.zhao\PycharmProjects\ci-helper\gui\config_table.py", line 61, in show_context_menu
    self.add_action.triggered.connect(self.add_service())
TypeError: argument 1 has unexpected type 'NoneType'

 

因此正确使用应该是使用 popup方法。

正确的代码如下

  # 创建右键菜单
    def show_context_menu(self):
        self.context_menu = QMenu(self)
        self.add_action = QAction("新增")
        self.delete_action = QAction("删除")
        self.context_menu.addAction(self.add_action)
        self.context_menu.addAction(self.delete_action)
        # 声明当鼠标在groupBox控件上右击时,在鼠标位置显示右键菜单只能用popup,exec/exec_两个都不行
        self.context_menu.popup(QCursor.pos())
        # 选中行数/列数
        select_size = len(self.tableView.selectionModel().selection().indexes())
        print("选中行数:" + str(select_size))
        for index in self.tableView.selectionModel().selection().indexes():
            row, column = index.row(), index.column()
            print(f"当前选中第{row},第{column}列")
        self.add_action.triggered.connect(self.add_service)
        # 如果需要传递参数
        self.delete_action.triggered.connect(lambda: self.remove_service(row))

 

PyQt5 中,可以通过实现 `QListView` 的 `contextMenuEvent()` 方法来添加右键菜单。下面是一个示例代码: ```python from PyQt5.QtWidgets import QApplication, QMainWindow, QListView, QMenu, QAction from PyQt5.QtCore import Qt class MyListView(QListView): def __init__(self, parent=None): super().__init__(parent) self.setContextMenuPolicy(Qt.CustomContextMenu) self.customContextMenuRequested.connect(self.show_context_menu) def show_context_menu(self, pos): menu = QMenu(self) delete_action = QAction("删除", self) menu.addAction(delete_action) action = menu.exec_(self.mapToGlobal(pos)) if action == delete_action: # do something pass class MainWindow(QMainWindow): def __init__(self): super().__init__() self.list_view = MyListView(self) self.setCentralWidget(self.list_view) if __name__ == '__main__': app = QApplication([]) window = MainWindow() window.show() app.exec_() ``` 在这个示例中,我们创建了一个名为 `MyListView` 的子类,继承自 `QListView`。在 `__init__()` 方法中,我们设置了 `contextMenuPolicy` 为 `Qt.CustomContextMenu`,并连接了 `customContextMenuRequested` 信号到 `show_context_menu()` 槽函数。 `show_context_menu()` 方法中,我们创建了一个 `QMenu` 对象,并添加了一个名为 "删除" 的动作。然后,我们调用 `menu.exec_()` 方法来显示右键菜单,并使用 `mapToGlobal()` 方法将 `pos` 转换为全局坐标。 最后,我们可以根据用户选择的动作执行相应的操作。在这个示例中,我们只是在 "删除" 动作中写了一个占位符,你可以在这里添加你自己的代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值