如何向 QTableWidget 的单元格添加右键单击操作(不是菜单)
How to add a right click action (not menu) to QTableWidget's cells
我目前有一个 QTableWidget 具有不同的单元格。当我左键单击一个单元格时,我希望它上面的数字增加 1,如果我右键单击,我希望数字减少 1。
第一部分我用的没问题
self.(widget_name).cellClicked.connect(self.addone)
右击出现问题。有内置的方法吗?我怎样才能实现它?我尝试从 QTableWidgets 创建我自己的 Table class 并覆盖 mousePressEvent 但是没有用(点击单元格周围没有做任何事情,它甚至没有 select 细胞)。也试过 eventFilter 但什么也没有。请参阅下面我在两种情况下使用的确切代码。
对于 mousePressEvent:
class Table(QtWidgets.QTableWidget):
def __init__(self,parent=None):
QtWidgets.QTableWidget.__init__(self,parent)
def mousePressEvent(self,QMouseEvent):
if QMouseEvent.button() == QtCore.LeftButton:
print('left') #FOR DEBUGGING
row = self.currentRow()
column = self.currentColumn()
new_text = round(float(self.item(row,column).text()) + 1,2)
self.item(row,column).setText(str(new_text))
elif event.button() == QtCore.RightButton:
print('right') #FOR DEBUGGING
row = self.currentRow()
column = self.currentColumn()
new_text = round(float(self.item(row,column).text()) - 1,2)
self.item(row,column).setText(str(new_text))
对于事件过滤器:
class Table(QtWidgets.QTableWidget):
def __init__(self,parent=None):
QtWidgets.QTableWidget.__init__(self,parent)
self.installEventFilter(self)
def eventFilter(self,QObject,event):
if event.type() == QtCore.QEvent.MouseButtonPress:
if event.button() == QtCore.LeftButton:
print('left') #FOR DEBUGGING
row = self.currentRow()
column = self.currentColumn()
new_text = round(float(self.item(row,column).text()) + 1,2)
self.item(row,column).setText(str(new_text))
elif event.button() == QtCore.RightButton:
print('right') #FOR DEBUGGING
row = self.currentRow()
column = self.currentColumn()
new_text = round(float(self.item(row,column).text()) - 1,2)
self.item(row,column).setText(str(new_text))
对于两者(创建 table)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
self.centralwidget = QtWidgets.QWidget(self)
....
self.parameters = Table(self.centralwidget)
...
...
调试文本(打印 'left' 或 'right')也没有出现在控制台中。
试一试:
class Table(QtWidgets.QTableWidget):
def mousePressEvent(self, event):
if event.button() == QtCore.Qt.LeftButton:
print('left') # FOR DEBUGGING
row = self.currentRow()
column = self.currentColumn()
new_text = round(float(self.item(row,column).text()) + 1,2)
self.item(row,column).setText(str(new_text))
elif event.button() == QtCore.Qt.RightButton:
print('right') # FOR DEBUGGING
row = self.currentRow()
column = self.currentColumn()
new_text = round(float(self.item(row,column).text()) - 1,2)
self.item(row,column).setText(str(new_text))
当您覆盖一个方法时,它总是调用父方法,因为它可能正在执行其他类型的任务,而您可能会忽略它。另一方面,如果我们这样做,代表将被激活以编辑文本,这是不想要的,所以我们建立一个没有发布者的新代表 returns 如下所示:
import sys
from PyQt5 import QtWidgets, QtGui, QtCore
class ReadOnlyDelegate(QtWidgets.QStyledItemDelegate):
def createEditor(self, *args, **kwargs):
return
class Table(QtWidgets.QTableWidget):
def __init__(self, *args, **kwargs):
QtWidgets.QTableWidget.__init__(self, *args, **kwargs)
self.setItemDelegate(ReadOnlyDelegate(self))
def mousePressEvent(self, event):
if event.button() == QtCore.Qt.LeftButton:
it = self.itemAt(event.pos())
new_text = round(float(it.text()) + 1,2)
it.setText(str(new_text))
elif event.button() == QtCore.Qt.RightButton:
it = self.itemAt(event.pos())
new_text = round(float(it.text()) - 1,2)
it.setText(str(new_text))
QtWidgets.QTableWidget.mousePressEvent(self, event)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
QtWidgets.QMainWindow.__init__(self, parent)
table = Table(5, 5)
self.setCentralWidget(table)
for i in range(5):
for j in range(5):
item = QtWidgets.QTableWidgetItem("{}".format(i*j))
table.setItem(i, j, item)
if __name__=='__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
我目前有一个 QTableWidget 具有不同的单元格。当我左键单击一个单元格时,我希望它上面的数字增加 1,如果我右键单击,我希望数字减少 1。
第一部分我用的没问题
self.(widget_name).cellClicked.connect(self.addone)
右击出现问题。有内置的方法吗?我怎样才能实现它?我尝试从 QTableWidgets 创建我自己的 Table class 并覆盖 mousePressEvent 但是没有用(点击单元格周围没有做任何事情,它甚至没有 select 细胞)。也试过 eventFilter 但什么也没有。请参阅下面我在两种情况下使用的确切代码。
对于 mousePressEvent:
class Table(QtWidgets.QTableWidget):
def __init__(self,parent=None):
QtWidgets.QTableWidget.__init__(self,parent)
def mousePressEvent(self,QMouseEvent):
if QMouseEvent.button() == QtCore.LeftButton:
print('left') #FOR DEBUGGING
row = self.currentRow()
column = self.currentColumn()
new_text = round(float(self.item(row,column).text()) + 1,2)
self.item(row,column).setText(str(new_text))
elif event.button() == QtCore.RightButton:
print('right') #FOR DEBUGGING
row = self.currentRow()
column = self.currentColumn()
new_text = round(float(self.item(row,column).text()) - 1,2)
self.item(row,column).setText(str(new_text))
对于事件过滤器:
class Table(QtWidgets.QTableWidget):
def __init__(self,parent=None):
QtWidgets.QTableWidget.__init__(self,parent)
self.installEventFilter(self)
def eventFilter(self,QObject,event):
if event.type() == QtCore.QEvent.MouseButtonPress:
if event.button() == QtCore.LeftButton:
print('left') #FOR DEBUGGING
row = self.currentRow()
column = self.currentColumn()
new_text = round(float(self.item(row,column).text()) + 1,2)
self.item(row,column).setText(str(new_text))
elif event.button() == QtCore.RightButton:
print('right') #FOR DEBUGGING
row = self.currentRow()
column = self.currentColumn()
new_text = round(float(self.item(row,column).text()) - 1,2)
self.item(row,column).setText(str(new_text))
对于两者(创建 table)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
self.centralwidget = QtWidgets.QWidget(self)
....
self.parameters = Table(self.centralwidget)
...
...
调试文本(打印 'left' 或 'right')也没有出现在控制台中。
试一试:
class Table(QtWidgets.QTableWidget):
def mousePressEvent(self, event):
if event.button() == QtCore.Qt.LeftButton:
print('left') # FOR DEBUGGING
row = self.currentRow()
column = self.currentColumn()
new_text = round(float(self.item(row,column).text()) + 1,2)
self.item(row,column).setText(str(new_text))
elif event.button() == QtCore.Qt.RightButton:
print('right') # FOR DEBUGGING
row = self.currentRow()
column = self.currentColumn()
new_text = round(float(self.item(row,column).text()) - 1,2)
self.item(row,column).setText(str(new_text))
当您覆盖一个方法时,它总是调用父方法,因为它可能正在执行其他类型的任务,而您可能会忽略它。另一方面,如果我们这样做,代表将被激活以编辑文本,这是不想要的,所以我们建立一个没有发布者的新代表 returns 如下所示:
import sys
from PyQt5 import QtWidgets, QtGui, QtCore
class ReadOnlyDelegate(QtWidgets.QStyledItemDelegate):
def createEditor(self, *args, **kwargs):
return
class Table(QtWidgets.QTableWidget):
def __init__(self, *args, **kwargs):
QtWidgets.QTableWidget.__init__(self, *args, **kwargs)
self.setItemDelegate(ReadOnlyDelegate(self))
def mousePressEvent(self, event):
if event.button() == QtCore.Qt.LeftButton:
it = self.itemAt(event.pos())
new_text = round(float(it.text()) + 1,2)
it.setText(str(new_text))
elif event.button() == QtCore.Qt.RightButton:
it = self.itemAt(event.pos())
new_text = round(float(it.text()) - 1,2)
it.setText(str(new_text))
QtWidgets.QTableWidget.mousePressEvent(self, event)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
QtWidgets.QMainWindow.__init__(self, parent)
table = Table(5, 5)
self.setCentralWidget(table)
for i in range(5):
for j in range(5):
item = QtWidgets.QTableWidgetItem("{}".format(i*j))
table.setItem(i, j, item)
if __name__=='__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())