'Change background cel and row QStandardItemModel

I have a form with 2 buttons, a tableview (populated through QStandardItemModel) and an inputfield to filter the data. So far this all works ok. now i would like to have Button1 (Runfunction1) change the backgroundcolor of specific cell and buton2 (Runfunction2) needs to change to color of the entire row. This is my code:

import timeit
import pandas as pd
from PyQt5 import QtGui
from PyQt5 import QtWidgets
from PyQt5.QtCore import Qt, QSortFilterProxyModel
from PyQt5.QtGui import *
from PyQt5.uic import loadUi


class PandasTableModel(QtGui.QStandardItemModel):

    def __init__(self, data, parent=None):

        QtGui.QStandardItemModel.__init__(self, parent)
        self._data = data

        for col in data.columns:
            data_col = [QtGui.QStandardItem("{}".format(x)) for x in data[col].values]
            self.appendColumn(data_col)
        return

    def rowCount(self, parent=None):
        return len(self._data.values)

    def columnCount(self, parent=None):
        return self._data.columns.size

    def headerData(self, x, orientation, role):

        if orientation == Qt.Horizontal and role == Qt.DisplayRole:
            return self._data.columns[x]
        if orientation == Qt.Vertical and role == Qt.DisplayRole:
            return self._data.index[x]

    def flags(self, index):
        if not index.isValid():
            return Qt.ItemIsEnabled

        return super().flags(index) | Qt.ItemIsEditable  # add editable flag.

    def setData(self, index, value, role):

        if role == Qt.EditRole:
            # Set the value into the frame.
            self._data.iloc[index.row(), index.column()] = value
            return True

        return False
        # return None


class TableViewer(QtWidgets.QMainWindow):

    def __init__(self):
        super(TableViewer, self).__init__()

        self.ui = loadUi("QTableViewForm.ui", self)
        self.ui.cmdRun1.clicked.connect(self.Runfunction1)
        self.ui.cmdRun2.clicked.connect(self.Runfunction2)

        self.LoadData()

    def LoadData(self):
        start = timeit.default_timer()
        print('Start LoadData')

        data = pd.read_pickle("productdata.pkl")
        df = pd.DataFrame(data)

        self.model = PandasTableModel(df)
        self.proxy_model2 = QStandardItemModel()
        self.proxy_model = QSortFilterProxyModel()
        self.proxy_model.setFilterKeyColumn(-1)  # Search all columns.
        self.proxy_model.setSourceModel(self.model)
        self.proxy_model.sort(0, Qt.AscendingOrder)
        self.proxy_model.setFilterCaseSensitivity(False)
        self.tableData.setModel(self.proxy_model)
        self.inputFilterImport.setText("")
        self.inputFilterImport.textChanged.connect(lambda: self.set_filter(self.inputFilterImport.text()))


        print('Stop LoadData')
        end = timeit.default_timer()
        print("Process Time: ", (end - start))

    def Runfunction1(self):
        start = timeit.default_timer()
        print('Start RunFunction1')


        print('Stop Runfunction1')
        end = timeit.default_timer()
        print("Process Time: ", (end - start))

    def Runfunction2(self):
        start = timeit.default_timer()
        print('Start RunFunction1')



        print('Stop Runfunction1')
        end = timeit.default_timer()
        print("Process Time: ", (end - start))

    def set_filter(self, inputfilter):

        # print("Start set_filter")

        self.proxy_model.setFilterFixedString(inputfilter)
        filter_result = self.proxy_model.rowCount()

        # print("Stop set_filter")
if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    win = TableViewer()
    win.show()
    sys.exit(app.exec_())

Please help ;-)

  • List item


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source