PyQt5 QTableWidget右键单击单元格赢得';t繁殖QMenu

PyQt5 QTableWidget右键单击单元格赢得';t繁殖QMenu,qt,pyqt,qt5,pyqt5,Qt,Pyqt,Qt5,Pyqt5,我的程序有一个表,人们希望能够右键单击所述表中的单元格,并产生适当的操作来操作该单元格(不同单元格的不同操作集)。我的测试代码只有一个生成表的小部件,在视口中安装一个事件过滤器,以确定右键单击了哪个单元格 import sys from PyQt5.QtWidgets import QApplication, QWidget, QAction, QMenu, QTableWidget, QTableWidgetItem, QVBoxLayout from PyQt5 import QtCore

我的程序有一个表,人们希望能够右键单击所述表中的单元格,并产生适当的操作来操作该单元格(不同单元格的不同操作集)。我的测试代码只有一个生成表的小部件,在视口中安装一个事件过滤器,以确定右键单击了哪个单元格

import sys
from PyQt5.QtWidgets import QApplication, QWidget, QAction, QMenu, QTableWidget, QTableWidgetItem, QVBoxLayout
from PyQt5 import QtCore


class TestRightClickTableWidget(QWidget):

    def __init__(self):
        super().__init__()

        self.tableWidget = QTableWidget()
        self.tableWidget.setRowCount(4)
        self.tableWidget.setColumnCount(2)
        self.tableWidget.setItem(0, 0, QTableWidgetItem("Cell 1"))
        self.tableWidget.setItem(0, 1, QTableWidgetItem("Cell 2"))
        self.tableWidget.setItem(1, 0, QTableWidgetItem("Cell 3"))
        self.tableWidget.setItem(1, 1, QTableWidgetItem("Cell 4"))
        self.tableWidget.setItem(2, 0, QTableWidgetItem("Cell 5"))
        self.tableWidget.setItem(2, 1, QTableWidgetItem("Cell 6"))
        self.tableWidget.setItem(3, 0, QTableWidgetItem("Cell 7"))
        self.tableWidget.setItem(3, 1, QTableWidgetItem("Cell 8"))

        self.tableWidget.viewport().installEventFilter(self)

        self.layout = QVBoxLayout()
        self.layout.addWidget(self.tableWidget)
        self.setLayout(self.layout)

    def eventFilter(self, source, event):
        if(event.type() == QtCore.QEvent.MouseButtonPress and
           event.buttons() == QtCore.Qt.RightButton and
           source is self.tableWidget.viewport()):
            item = self.tableWidget.itemAt(event.pos())
            print('Global Pos:', event.globalPos())
            if item is not None:
                print('Table Item:', item.row(), item.column())
                menu = QMenu(self)
                menu.addAction(QAction('test'))
                menu.exec_(event.globalPos())
        return super(TestRightClickTableWidget, self).eventFilter(source, event)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = TestRightClickTableWidget()
    ex.show()
    sys.exit(app.exec_())
因此,我可以找到正确的单元格,以及在菜单上运行exec_uu的全局位置。但是菜单不会显示在屏幕上。我想知道这是不是一个Qt错误,菜单不会在表中生成,或者我没有正确创建/执行菜单。任何帮助都将不胜感激。多谢各位

试试看:

导入系统 从PyQt5.qtwidts导入(QApplication、QWidget、QAction、QMenu、QTableWidget、, QMainWindow、QTableWidgetItem、QVBoxLayout) 从PyQt5导入QtCore 类TestRightClickTableWidget(QWidget):#(QMainWindow):#(QWidget):# 定义初始化(自): super()。\uuuu init\uuuuu() self.tableWidget=QTableWidget() self.tableWidget.setRowCount(4) self.tableWidget.setColumnCount(2) self.tableWidget.setItem(0,0,QTableWidgetItem(“单元格1”)) self.tableWidget.setItem(0,1,QTableWidgetItem(“单元格2”)) self.tableWidget.setItem(1,0,QTableWidgetItem(“单元格3”)) self.tableWidget.setItem(1,1,QTableWidgetItem(“单元格4”)) self.tableWidget.setItem(2、0、QTableWidgetItem(“单元格5”)) self.tableWidget.setItem(2,1,QTableWidgetItem(“单元格6”)) self.tableWidget.setItem(3,0,QTableWidgetItem(“单元格7”)) self.tableWidget.setItem(3,1,QTableWidgetItem(“单元格8”)) ###此属性保存小部件显示上下文菜单的方式 self.tableWidget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)#+++ ###此信号在小部件的contextMenuPolicy为Qt::CustomContextMenu时发出, ###并且用户已请求小部件上的上下文菜单。 self.tableWidget.customContextMenuRequested.connect(self.generateMenu)#+++ self.tableWidget.viewport().installEventFilter(self) self.layout=QVBoxLayout() self.layout.addWidget(self.tableWidget) self.setLayout(self.layout) def eventFilter(自身、源、事件): 如果(event.type()==QtCore.QEvent.mousebutton按下并 event.buttons()==QtCore.Qt.RightButton和 源是self.tableWidget.viewport()): item=self.tableWidget.itemAt(event.pos()) 打印('Global Pos:',event.globalPos()) 如果项目不是无: 打印('Table Item:',Item.row(),Item.column()) self.menu=QMenu(self) self.menu.addAction(item.text())#(QAction('test')) #menu.exec(event.globalPos()) 返回超级(TestRightClickTableWidget,self).eventFilter(源,事件) ### +++ def发生器(自身、位置): 打印(“pos===”,pos) self.menu.exec#(self.tableWidget.mapToGlobal(pos))#+++ 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': app=QApplication(sys.argv) ex=TestRightClickTableWidget() 例如:show() sys.exit(app.exec_())