【问题标题】:PyQt5 QTableWidget Right Click on Cell Won't Spawn QMenuPyQt5 QTableWidget 右键单击​​单元格不会产生 QMenu
【发布时间】: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 错误,其中菜单不会在表格中产生,或者我没有正确创建/执行菜单。任何帮助,将不胜感激。谢谢你。

【问题讨论】:

    标签: qt pyqt qt5 pyqt5


    【解决方案1】:

    试试看:

    import sys
    from PyQt5.QtWidgets import (QApplication, QWidget, QAction, QMenu, QTableWidget, 
                                 QMainWindow, QTableWidgetItem, QVBoxLayout, )
    from PyQt5 import QtCore
    
    
    class TestRightClickTableWidget(QWidget): #(QMainWindow):   # (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"))
            
            ### This property holds how the widget shows a context menu
            self.tableWidget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)     # +++
            ### This signal is emitted when the widget's contextMenuPolicy is Qt::CustomContextMenu, 
            ### and the user has requested a context menu on the widget. 
            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(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())
                    self.menu = QMenu(self)
                    self.menu.addAction(item.text())         #(QAction('test'))
                    #menu.exec_(event.globalPos())
            return super(TestRightClickTableWidget, self).eventFilter(source, event)
    
        ### +++    
        def generateMenu(self, pos):
            print("pos======",pos)
            self.menu.exec_(self.tableWidget.mapToGlobal(pos))   # +++
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        ex = TestRightClickTableWidget()
        ex.show()
        sys.exit(app.exec_())
    

    【讨论】:

      猜你喜欢
      • 2018-11-13
      • 2017-07-31
      • 1970-01-01
      • 2020-12-25
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多