Qt World Summit: Register Today!

Set background of specific row in QTableView

  • Hello, please how can I set background of specific row (for example second) in QTableView (programmatically).

  • You can set it at the model level (all views connected to the model are affected)

    void setRowColor(QAbstractItemModel* model, int row, const QBrush& color, const QModelIndex& parent = QModelIndex()){
    if(!model) return;
    if(row<0 || row>=model->rowCount(parent)) return;
    const int colCount = model->columnCount(parent);
    for (int j = 0; j < colCount; ++j)

    or use a delegate for the specific view (the one below lets you specify the color for entire row and column and for individual cell):

    #include <QStyledItemDelegate>
    #include <QApplication>
    #include <QHash>
    class BackGroungColorDelegate : public QStyledItemDelegate
        explicit BackGroungColorDelegate(QObject *parent = Q_NULLPTR)
        virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE{
            QStyleOptionViewItem opt = option;
            initStyleOption(&opt, index);
            if (!index.parent().isValid()) {
                if (hasCellColor(index.row(), index.column()))
                    opt.backgroundBrush = colorForCell(index.row(), index.column());
            const QWidget *widget = option.widget;
            QStyle *style = widget ? widget->style() : QApplication::style();
            style->drawControl(QStyle::CE_ItemViewItem, &opt, painter, widget);
        void setColorForRow(int row, const QBrush& val){
            m_rowColors[row] = val;
        QBrush colorForRow(int row) const {
            return m_rowColors.value(row);
        void removeColorForRow(int row){
        void clearRowColors(){
        void setColorForCol(int col, const QBrush& val)
            m_colColors[col] = val;
        QBrush colorForCol(int col) const
            return m_colColors.value(col);
        void removeColorForCol(int col)
        void clearColColors()
        void setColorForCell(int row, int col, const QBrush& val){
            m_cellColors[cellKey(row, col)] = val;
        QBrush colorForCell(int row, int col) const
            return m_cellColors.value(cellKey(row, col), m_rowColors.value(row, m_colColors.value(col)));
        void removeColorForCell(int row, int col)
            m_cellColors.remove(cellKey(row, col));
        void clearCellColors()
        QHash<quint64,QBrush> m_cellColors;
        QHash<int, QBrush> m_rowColors;
        QHash<int, QBrush> m_colColors;
        Q_DECL_CONSTEXPR quint64 cellKey(int row, int col) const
            return (static_cast<quint64>(row) << 32) | static_cast<quint64>(col);
        bool hasCellColor(int row, int col) const{
            return m_cellColors.contains(cellKey(row, col))
               || m_rowColors.contains(row)
               || m_colColors.contains(col);

Log in to reply