发送信号以突出显示 QtableWidget PyQt 中的单元格
Sending a signal to highlight cell in QtableWidget PyQt
在我的应用程序中,我想检查特定列中的每个单元格是否有空字段。如果为空,我想突出显示该单元格。更改该单元格后,我想取消突出显示它。下面的代码有效,但在函数高亮显示两次后将完全停止高亮显示。请告诉我为什么会发生这种情况以及如何修复此代码。
def getAllTableValues(self):
for index in range(self.rowCount()):
item = self.item(index,2)
if item.text() == "":
item.setBackground(QtCore.Qt.red)
self.itemChanged.connect(lambda: self.changeToWhite(item))
return None
allRows = self.getAllRows()
def changeToWhite(self, item):
item.setBackground(QtCore.Qt.white)
编辑: 貌似QwidgetItem在高亮了两次后就全部停止高亮了。其他单元格将继续突出显示,直到突出显示两次。
每次修改项目时都会调用 itemChanged
,尽管修改会清除单元格。更好的选择是使用根据显示的文本更改颜色的委托:
from PyQt5 import QtCore, QtGui, QtWidgets
class HighlightDelegate(QtWidgets.QStyledItemDelegate):
def initStyleOption(self, option, index):
super(HighlightDelegate, self).initStyleOption(option, index)
color = QtGui.QColor(QtCore.Qt.white if option.text else QtCore.Qt.red)
option.backgroundBrush = QtGui.QBrush(color)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
table = QtWidgets.QTableWidget(10, 10)
delegate = HighlightDelegate(table)
table.setItemDelegateForColumn(2, delegate)
self.setCentralWidget(table)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
在我的应用程序中,我想检查特定列中的每个单元格是否有空字段。如果为空,我想突出显示该单元格。更改该单元格后,我想取消突出显示它。下面的代码有效,但在函数高亮显示两次后将完全停止高亮显示。请告诉我为什么会发生这种情况以及如何修复此代码。
def getAllTableValues(self):
for index in range(self.rowCount()):
item = self.item(index,2)
if item.text() == "":
item.setBackground(QtCore.Qt.red)
self.itemChanged.connect(lambda: self.changeToWhite(item))
return None
allRows = self.getAllRows()
def changeToWhite(self, item):
item.setBackground(QtCore.Qt.white)
编辑: 貌似QwidgetItem在高亮了两次后就全部停止高亮了。其他单元格将继续突出显示,直到突出显示两次。
itemChanged
,尽管修改会清除单元格。更好的选择是使用根据显示的文本更改颜色的委托:
from PyQt5 import QtCore, QtGui, QtWidgets
class HighlightDelegate(QtWidgets.QStyledItemDelegate):
def initStyleOption(self, option, index):
super(HighlightDelegate, self).initStyleOption(option, index)
color = QtGui.QColor(QtCore.Qt.white if option.text else QtCore.Qt.red)
option.backgroundBrush = QtGui.QBrush(color)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
table = QtWidgets.QTableWidget(10, 10)
delegate = HighlightDelegate(table)
table.setItemDelegateForColumn(2, delegate)
self.setCentralWidget(table)
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())