发送信号以突出显示QtableWidget PyQt中的单元格

时间:2018-10-01 22:33:05

标签: python pyqt pyqt5 qtablewidget

在我的应用程序中,我想检查特定列中的每个单元格是否为空字段。如果为空,我想突出显示该单元格。当该单元格已更改时,我要取消突出显示它。下面的代码有效,但是在该功能两次突出显示之后,将完全停止突出显示。请告诉我为什么会这样,以及如何解决此代码。

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两次突出显示后,将不再同时突出显示所有内容。其他单元格将继续突出显示,直到突出显示两次。

1 个答案:

答案 0 :(得分:0)

每次修改项目时都会调用

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_())