Python 在某些情况下,从QTableWidget获取无效的QModelIndex

Python 在某些情况下,从QTableWidget获取无效的QModelIndex,python,python-3.x,pyqt,pyqt5,Python,Python 3.x,Pyqt,Pyqt5,我使用光标位置来获取光标正在选择的单元格,然后用它来决定上下文菜单应该有什么。但是,在小的表上,例如只有2行的表,我得到了很多无效索引,导致该索引返回None,并随后失败。如果我全屏显示该应用程序,它会在左上角的单元格中工作,但不会在其他单元格中工作。我对为什么会发生这种情况知之甚少,我真的希望人们能用这个例子重现同样的问题,我正在经历这个问题 import traceback from PyQt5.QtGui import QCursor from PyQt5.QtWidgets impor

我使用光标位置来获取光标正在选择的单元格,然后用它来决定上下文菜单应该有什么。但是,在小的表上,例如只有2行的表,我得到了很多无效索引,导致该索引返回None,并随后失败。如果我全屏显示该应用程序,它会在左上角的单元格中工作,但不会在其他单元格中工作。我对为什么会发生这种情况知之甚少,我真的希望人们能用这个例子重现同样的问题,我正在经历这个问题

import traceback

from PyQt5.QtGui import QCursor
from PyQt5.QtWidgets import QTableWidget, QMenu, QApplication, QTableWidgetItem

import sys


class TableWidget(QTableWidget):
    def contextMenuEvent(self, event):

        cursor = QCursor.pos()

        index = self.indexAt(cursor)
        try:
            column = self.itemFromIndex(index).column()
            menu = QMenu(self)
            if column:
                menu.addAction('TEST')
            else:
                menu.addAction('Fail')
            menu.exec(QCursor.pos())
        except Exception as e:
            traceback.print_exc()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    gui = TableWidget()
    gui.setColumnCount(3)
    gui.insertRow(0)
    gui.insertRow(0)
    gui.insertRow(0)
    gui.setItem(0, 0, QTableWidgetItem('0'))
    gui.setItem(1, 0, QTableWidgetItem('0'))
    gui.setItem(2, 0, QTableWidgetItem('0'))
    gui.setItem(0, 1, QTableWidgetItem('0'))
    gui.setItem(0, 2, QTableWidgetItem('0'))
    gui.setItem(1, 1, QTableWidgetItem('0'))
    gui.setItem(1, 2, QTableWidgetItem('0'))

    gui.show()
    app.exec()
try/except只是为了展示它即将崩溃,并给出以下错误:

Traceback (most recent call last):
  File "C:/Users/THOMAS/PycharmProjects/Scripts/test2.py", line 17, in contextMenuEvent
    column = self.itemFromIndex(index).column()
AttributeError: 'NoneType' object has no attribute 'column'
因为QModelindex无效。(已使用.isValid()进行检查)

我还尝试使用
self.itemAt(cursor)
,结果完全相同。除了全屏显示和在单元格0、0中之外,我什么都没有

此行中的错误:

cursor = QCursor.pos ()
改为:

cursor = event.pos ()
试试看:

import traceback

from PyQt5.QtGui import QCursor
from PyQt5.QtWidgets import QTableWidget, QMenu, QApplication, QTableWidgetItem

import sys


class TableWidget(QTableWidget):

    def contextMenuEvent(self, event):

        #cursor = QCursor.pos()
        cursor = event.pos()

        index = self.indexAt(cursor)

        try:
            column = self.itemFromIndex(index).column()
            menu = QMenu(self)
            if column:
                menu.addAction('TEST')
            else:
                menu.addAction('Fail')

            menu.exec(QCursor.pos())
        except Exception as e:
            traceback.print_exc()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    gui = TableWidget()
    gui.setColumnCount(3)
    gui.insertRow(0)
    gui.insertRow(0)
    gui.insertRow(0)
    gui.setItem(0, 0, QTableWidgetItem('0'))
    gui.setItem(1, 0, QTableWidgetItem('0'))
    gui.setItem(2, 0, QTableWidgetItem('0'))
    gui.setItem(0, 1, QTableWidgetItem('0'))
    gui.setItem(0, 2, QTableWidgetItem('0'))
    gui.setItem(1, 1, QTableWidgetItem('0'))
    gui.setItem(1, 2, QTableWidgetItem('0'))

    gui.show()
    app.exec()

此行中出现错误:

cursor = QCursor.pos ()
改为:

cursor = event.pos ()
试试看:

import traceback

from PyQt5.QtGui import QCursor
from PyQt5.QtWidgets import QTableWidget, QMenu, QApplication, QTableWidgetItem

import sys


class TableWidget(QTableWidget):

    def contextMenuEvent(self, event):

        #cursor = QCursor.pos()
        cursor = event.pos()

        index = self.indexAt(cursor)

        try:
            column = self.itemFromIndex(index).column()
            menu = QMenu(self)
            if column:
                menu.addAction('TEST')
            else:
                menu.addAction('Fail')

            menu.exec(QCursor.pos())
        except Exception as e:
            traceback.print_exc()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    gui = TableWidget()
    gui.setColumnCount(3)
    gui.insertRow(0)
    gui.insertRow(0)
    gui.insertRow(0)
    gui.setItem(0, 0, QTableWidgetItem('0'))
    gui.setItem(1, 0, QTableWidgetItem('0'))
    gui.setItem(2, 0, QTableWidgetItem('0'))
    gui.setItem(0, 1, QTableWidgetItem('0'))
    gui.setItem(0, 2, QTableWidgetItem('0'))
    gui.setItem(1, 1, QTableWidgetItem('0'))
    gui.setItem(1, 2, QTableWidgetItem('0'))

    gui.show()
    app.exec()