Отправка сигнала для выделения ячейки в QtableWidget PyQt - PullRequest
0 голосов
/ 02 октября 2018

В моем приложении я хочу проверить каждую ячейку в определенном столбце на наличие пустых полей.Если пусто, я хотел бы выделить ячейку.Когда эта ячейка была изменена, я хочу ее выделить.Приведенный ниже код работает, но полностью перестанет выделяться после того, как функция высветит что-то дважды.Пожалуйста, скажите мне, почему это происходит и как исправить этот код.

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 голосов
/ 02 октября 2018

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