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

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

猜你喜欢

转载自blog.csdn.net/kanyun123/article/details/116884201