我正在使用光标位置来获取光标所选择的单元格,然后使用它来决定上下文菜单应该具有的内容。但是,在小型表上,例如只有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中时,我得到无。
答案 0 :(得分:1)
错误在这一行:
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()