在使用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))