【发布时间】:2019-01-08 04:37:36
【问题描述】:
我的程序有一个表格,并且希望能够右键单击所述表格中的一个单元格并产生适当的操作来操作该单元格(不同单元格的不同操作集)。我的测试代码只有一个生成表格的小部件,在视口上安装了一个事件过滤器来确定哪个单元格被右键单击。
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_ 的全局位置。但菜单不会显示在屏幕上。我想知道这是否是一个 Qt 错误,其中菜单不会在表格中产生,或者我没有正确创建/执行菜单。任何帮助,将不胜感激。谢谢你。
【问题讨论】: