2017-06-28 13 views
1

QTableViewの行を色分けする正しい方法は何ですか?QSqlRelationalTableModel QTableViewの行を色分けする

私は、列の1つに設定された特定の値に基づいて行を色分けするスプレッドシートアプリケーションを開発しています。私はQSqlRelationalTableModelQSqlRelationalDelegateを使います。なぜなら、色を決定する値は外部キーであるからです。

なぜ次のように簡単にできないのですか?何か案は?

model->setData(model->index(index.row(), index.column()), 
       QBrush(Qt::red), 
       Qt::BackgroundRole); 
+0

逆:あなたのモデルの 'data()'関数は、特定の値に対して 'Qt :: red'を返さなければなりません。 – vahancho

答えて

1

あなたはQSqlRelationalTableModelのデータ機能を上書きしなければならない、あなたはQtの:: BackgroundRoleの役割は、あなたのケースに応じてフィルタリングし、外国人のフィールドで、次の例のフィルタでは、適切なQBrushを返し、それかどうかを確認するために取得するときリマに等しい:

例:

sqlrelationaltablemodel.h

#ifndef SQLRELATIONALTABLEMODEL_H 
#define SQLRELATIONALTABLEMODEL_H 

#include <QSqlRelationalTableModel> 

class SqlRelationalTableModel : public QSqlRelationalTableModel 
{ 
    Q_OBJECT 
public: 
    SqlRelationalTableModel(QObject * parent = 0, QSqlDatabase db = QSqlDatabase()); 

    QVariant data(const QModelIndex & item, int role = Qt::DisplayRole) const; 
}; 

#endif // SQLRELATIONALTABLEMODEL_H 

sqlrelationaltablemodel.cpp

#include "sqlrelationaltablemodel.h" 

#include <QBrush> 

SqlRelationalTableModel::SqlRelationalTableModel(QObject *parent, QSqlDatabase db) 
    :QSqlRelationalTableModel(parent, db) 
{ 

} 

QVariant SqlRelationalTableModel::data(const QModelIndex &item, int role) const 
{ 
    if(role == Qt::BackgroundRole) 
     if(QSqlRelationalTableModel::data(index(item.row(), 2), Qt::DisplayRole).toString().trimmed() == "Lima") 
         return QVariant(QBrush(Qt::red)); 
    return QSqlRelationalTableModel::data(item, role); 
} 

出力:

enter image description here

完全な例は、hereを見つけることができます。

+0

素晴らしい!ありがとう、私は必要なものをちょうど微調整して、たくさん! – Tylnesh

関連する問題