我正在尝试更改QTableWidget mouse pressed事件方法,以根据用户是右键单击还是左键单击对单元格项执行不同的操作。左键单击self.tableWidget中的单元格时,出现以下错误:
AttributeError: 'Table' object has no attribute 'tableWidget' (line 114 [commented below])
下面是我的代码:
from PyQt5 import QtCore, QtGui, QtWidgets
from WordSearch import WordSearch as ws
ws = ws()
class Table(QtWidgets.QTableWidget): #overwriting QTableWidgets to allow for right click events
def __init__(self, *args, **kwargs):
QtWidgets.QTableWidget.__init__(self, *args, **kwargs)
def mousePressEvent(self, event):
if event.button() == QtCore.Qt.LeftButton:
item = self.itemAt(event.pos())
print (item.row(), item.column()) #FOR DEBUGGUNG
Ui_MainWindow.leftClickLetter(self, item.row(), item.column())
elif event.button() == QtCore.Qt.RightButton:
print("RIGHT CLICK!") #FOR DEBUGGING
QtWidgets.QTableWidget.mousePressEvent(self, event)
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
.....
self.generate.clicked.connect(self.generateTable)
.....
def generateTable(self):
self.tableWidget = Table(self.centralwidget)
self.tableWidget.setObjectName("tableWidget")
self.tableWidget.setColumnCount(int(self.size.text()))
self.tableWidget.setRowCount(int(self.size.text()))
self.tableWidget.show()
def leftClickLetter(self, row, col):
item = self.tableWidget.item(row, col) #Line 114
item.setBackground(QtGui.QColor(216,191,216))
if (row, col) not in self.coordsToCheck:
self.coordsToCheck.append((row,col))
self.tableWidget.clearSelection()
我删掉了一些我认为不相关的代码,但如果我需要添加,请告诉我。generateTable()总是在leftClickLetter()之前调用,因此self.tableWidget应该是Table类型的正确变量名
说明:
要了解问题,应分析以下示例:
输出:
如您所见,对象“self”不是指“A”实例,而是指传递给该方法的第一个参数,为什么会出现这种问题?因为您试图通过类使用方法,但必须使用实例,例如:
输出:
我们看到“自我”指的是“A”类的客体
以上是由于对OOP知之甚少而导致的错误,因此我的建议是查看您在该主题上的注释。
解决方案:
注意:首先,不建议修改Qt Designer生成的类,因此您必须还原该类,以便应用我的解决方案
在您的情况下,无需覆盖任何方法,因为如果单击了某个项目,会有多个信号通知您:
^{}
^{}
更新:
如果要检测右键单击,则必须创建信号,而不是直接调用方法:
相关问题 更多 >
编程相关推荐