How do I Color a QTableView row in PyQt4

Mel melirizarry at gmail.com
Thu Mar 1 09:05:17 EST 2007


On Feb 28, 5:08 pm, David Boddie <d... at boddie.org.uk> wrote:
> On Wednesday 28 February 2007 18:55, Mel wrote:
>
>
>
> > I am currently porting an SQL centered Visual Basic application to run
> > on Linux, Python, and Qt4.  Currently I am stumped on changing row
> > colors in the QTableView widget.  My test code is based on code from
> > the PyQt4  examples and looks like this:
>
> > *** Start Code ***
>
> > import sys
> > from PyQt4 import QtCore, QtGui, QtSql
>
> > import connection
>
> > class CustomSqlModel(QtSql.QSqlQueryModel):
> >     def data(self, index, role):
> >         value = QtSql.QSqlQueryModel.data(self, index, role)
> >         if value.isValid() and role == QtCore.Qt.DisplayRole:
> >             if index.column() == 0:
> >                 return QtCore.QVariant(value.toString().prepend("#"))
> >             elif index.column() == 2:
> >                 return QtCore.QVariant(value.toString().toUpper())
> >         if role == QtCore.Qt.TextColorRole and index.column() == 1:
> >             return QtCore.QVariant(QtGui.QColor(QtCore.Qt.blue))
> >         return value
>
> [Snipping the rest of the code to keep this post short.]
>
> > Column 18 in the table shows a number from 1 to 3.  I would like to
> > change the color of the row based on the value in column 18 but I have
> > not been able to find any resources that show me how.  Can anyone lend
> > a hand?
>
> It's interesting to see that you subclassed QSqlQueryModel instead of
> using a custom delegate to display the data. It's usually recommended
> that you subclass QItemDelegate if you want to customize the way items
> are represented, but you can also customize the model if you want.
>
> What you can do is to check to see if the requested role is the
> Qt.BackgroundRole and, if so, query the base class for the data in
> column 18 in the same row. Then you can supply a different colour
> (as a brush, actually) depending on the value you obtained.
>
>         if role == QtCore.Qt.BackgroundRole:
>             # Get the data from column 18.
>             column18_data = index.sibling(index.row(), 18).data()
>             # The data is stored in a QVariant, so we unpack it.
>             integer_value = column18_data.toInt()[0] # just the value
>             # Look up the associated color in a dictionary which you
>             # have already defined, and return it.
>             color = self.colors.get(integer_value, self.default_color)
>             return QtCore.QVariant(QtGui.QBrush(color))
>
> You might also find the following pages useful:
>
> http://www.riverbankcomputing.com/Docs/PyQt4/html/qt.html#ItemDataRol...http://doc.trolltech.com/4.2/model-view-model.html
>
> Good luck!
>
> David

Thanks David, that did work as I had hoped.  I just need to work on
the colors a bit and make them more appealing.

Here is my final code that works for the custom Sql Model.

class CustomSqlModel(QtSql.QSqlQueryModel):
    def data(self, index, role):
        value = QtSql.QSqlQueryModel.data(self, index, role)
        if value.isValid() and role == QtCore.Qt.DisplayRole:
            if index.column() == 0:
                return QtCore.QVariant(value.toString().prepend("#"))
            elif index.column() == 2:
                return QtCore.QVariant(value.toString().toUpper())
        if role == QtCore.Qt.TextColorRole and index.column() == 1:
            return QtCore.QVariant(QtGui.QColor(QtCore.Qt.blue))
        if role == QtCore.Qt.BackgroundRole:

            # Get the data from column 18.

            column18_data = index.sibling(index.row(), 18).data()

            # The data is stored in a QVariant, so we unpack it.

            integer_value = column18_data.toInt()[0] # just the value

            # Look up the associated color in a dictionary which you

            # have already defined, and return it.
            if integer_value == 1:

                return
QtCore.QVariant(QtGui.QBrush(QtGui.QColor(QtCore.Qt.red)))
            if integer_value == 2:

                return
QtCore.QVariant(QtGui.QBrush(QtGui.QColor(QtCore.Qt.yellow)))
            if integer_value == 3:

                return
QtCore.QVariant(QtGui.QBrush(QtGui.QColor(QtCore.Qt.green)))
        return value


Mel




More information about the Python-list mailing list