Set color to a QTableView row

前端 未结 2 1810
无人及你
无人及你 2020-12-09 11:58
void MyWindow::initializeModelBySQL(QSqlQueryModel *model,QTableView *table,QString sql){
        model = new QSqlQueryModel(this);
        model->setQuery(sql);
         


        
相关标签:
2条回答
  • 2020-12-09 12:26

    The view draws the background based on the Qt::BackgroundRole role of the cell which is the QBrush value returned by QAbstractItemModel::data(index, role) for that role.

    You can subclass the QSqlQueryModel to redefine data() to return your calculated color, or if you have Qt > 4.8, you can use a QIdentityProxyModel:

    class MyModel : public QIdentityProxyModel
    {
        QColor calculateColorForRow(int row) const {
            ...
        }
    
        QVariant data(const QModelIndex &index, int role)
        {
            if (role == Qt::BackgroundRole) {
               int row = index.row();
               QColor color = calculateColorForRow(row);           
               return QBrush(color);
            }
            return QIdentityProxyModel::data(index, role);
        }
    };
    

    And use that model in the view, with the sql model set as source with QIdentityProxyModel::setSourceModel.

    OR

    You can keep the model unchanged and modify the background with a delegate set on the view with QAbstractItemView::setItemDelegate:

    class BackgroundColorDelegate : public QStyledItemDelegate {
    
    public:
        BackgroundColorDelegate(QObject *parent = 0)
            : QStyledItemDelegate(parent)
        {
        }
        QColor calculateColorForRow(int row) const;
    
        void initStyleOption(QStyleOptionViewItem *option,
                             const QModelIndex &index) const
        {
            QStyledItemDelegate::initStyleOption(option, index);
    
            QStyleOptionViewItemV4 *optionV4 =
                    qstyleoption_cast<QStyleOptionViewItemV4*>(option);
    
            optionV4->backgroundBrush = QBrush(calculateColorForRow(index.row()));
        }
    };
    

    As the last method is not always obvious to translate from C++ code, here is the equivalent in python:

    def initStyleOption(self, option, index):
        super(BackgroundColorDelegate,self).initStyleOption(option, index)
        option.backgroundBrush = calculateColorForRow(index.row())
    
    0 讨论(0)
  • 2020-12-09 12:32

    Your best bet is to define a custom model (QAbstractTableModel subclass). You probably want to have a QSqlQueryModel as a member in this custom class.

    If it's a read-only model, you need to implement at least these methods:

     int rowCount(const QModelIndex &parent) const;
     int columnCount(const QModelIndex &parent) const;
     QVariant data(const QModelIndex &index, int role) const;
    

    and for well behaved models also

     QVariant headerData(int section, Qt::Orientation orientation, int role) const;
    

    If you need the model to be able to edit/submit data, things get a bit more involved and you will also need to implement these methods:

     Qt::ItemFlags flags(const QModelIndex &index) const;
     bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole);
     bool insertRows(int position, int rows, const QModelIndex &index=QModelIndex());
     bool removeRows(int position, int rows, const QModelIndex &index=QModelIndex()); 
    

    What will actually change a row appearance lies in the return value of this method:

     QVariant data(const QModelIndex &index, int role) const;
    

    A dumb example:

     QVariant MyCustomModel::data(const QModelIndex &index, int role) const
     {
         if ( !index.isValid() )
             return QVariant();
    
         int row = index.row();
         int col = index.column();
    
    
         switch ( role )
         {
    
            case Qt::BackgroundRole:
            {
                if(somecondition){
                   // background for this row,col is blue
                   return QVariant(QBrush (QColor(Qt::blue)));
                }
                // otherwise background is white
                return QVariant(QBrush (QColor(Qt::white)));
            }
    
            case Qt::DisplayRole:
            {
               // return actual content for row,col here, ie. text, numbers
    
            }
    
            case Qt::TextAlignmentRole:
            {
    
               if (1==col)
                  return QVariant ( Qt::AlignVCenter | Qt::AlignLeft );
    
               if (2==col)
                  return QVariant ( Qt::AlignVCenter | Qt::AlignTrailing );
    
               return QVariant ( Qt::AlignVCenter | Qt::AlignHCenter );
    
            }
         }
    
      }
    
    0 讨论(0)
提交回复
热议问题