У меня есть вложенный QAbstractTableModel
, который содержит значения типа None, чтобы отображать строки как пустые
class ViewModel(qtc.QAbstractTableModel):
def __init__(self, input_data=None):
super().__init__()
self.input_data = input_data or [[None, None],[None, None]]
Я хочу изменить цвета ячеек, если вставленные значения ( заменяя значения типа None) находятся в / из определенного диапазона
например z = 12 <= x <= 20
# False == red, True == green
цвет должен меняться только в том случае, если элементы редактируются или self.model.layoutChanged.emit()
выполняется
ответы на изменение цвета фона ячейки QTableView предлагают внести изменения в метод данных Как изменить цвет фона ячейки QTableView [дубликат] но это собираюсь раскрасить ячейки в самом начале
Я нашел подход на форуме QT для вставки прокси-модели между представлением и моделью Как просто изменить цвет фона ячейки внутри TableView
Я пытаюсь реализовать код в Pyqt5, но пока безуспешно. Есть ли подход PyQt5, о котором я не знаю?
пример кода
import sys
import re
from PyQt5 import QtWidgets as qtw
from PyQt5 import QtCore as qtc
class ViewModel(qtc.QAbstractTableModel):
def __init__(self, input_data=None):
super().__init__()
self.input_data = input_data or [[None, None],[None, None]]
def data(self, index, role): # parameter index, role are needed !
if role == qtc.Qt.DisplayRole:
try:
text = self.input_data[index.row()][index.column()]
except IndexError:
text = None
return text
def rowCount(self, index=qtc.QModelIndex()):
return 0 if index.isValid() else len(self.input_data)
def columnCount(self, index):
return len(self.input_data[0])
def headerData(self, section, orientation, role):
# section is wich index of the orintation
if role == qtc.Qt.DisplayRole:
if orientation == qtc.Qt.Vertical:
return "row"
def flags(self, index):
return qtc.Qt.ItemIsEditable | qtc.Qt.ItemIsSelectable | qtc.Qt.ItemIsEnabled
def setData(self, index, value, role=qtc.Qt.EditRole):
if role == qtc.Qt.EditRole:
try:
row = index.row()
column = index.column()
pattern = '^[\d]+(?:,[\d]+)?$'
if re.fullmatch(pattern, value, flags=0):
print("true")
self.input_data[row][column] = value # float
else:
print("nope")
pass
return True
except ValueError:
print("not a number")
return False
class MainWindow(qtw.QWidget):
def __init__(self):
super().__init__()
# View
table_view = qtw.QTableView()
self.model = ViewModel()
table_view.setModel(self.model)
# size and position
qtRectangle = self.frameGeometry()
centerPoint = qtw.QDesktopWidget().availableGeometry().center()
qtRectangle.moveCenter(centerPoint)
self.move(qtRectangle.topLeft())
# size
self.resize(1000, 410)
# layout
qvboxlayout = qtw.QVBoxLayout()
qvboxlayout.addWidget(table_view)
self.setLayout(qvboxlayout)
self.show()
if __name__ == '__main__':
app = qtw.QApplication(sys.argv)
w = MainWindow()
sys.exit(app.exec_())