1

データベースからQtテーブルにデータを表示する方法を理解しようとしています。ブール値の表示値を「PASS」または「FAIL」に変更し、それに応じて行の色を変更します。

QSqlQueryModelモデルの派生クラスを作成し、関数をオーバーライドしました。

QVariant TestResultsViewModel::data(const QModelIndex &index, int role) const
{
    QVariant value = QSqlQueryModel::data(index, role);

    if (value.isValid() && role == Qt::DisplayRole){
        switch(index.column()){
        case 0:
            return value.toBool() ? "PASS" : "FAIL";
        }
    }

    if (role == Qt::TextColorRole){
        // Get column 0
        QVariant pass = index.sibling(index.row(), 0).data();
        if (pass.isValid()){
            if (pass.toBool()){
                return QVariant::fromValue(QColor(Qt::blue));
            }
            else{
                return QVariant::fromValue(QColor(Qt::red));
            }
        }
    }

    return value;
}

しかし、最初の部分が最初に実行され、その後、列の値が「PASS」または「FAIL」であり、0、1ではないため、色が変化しないように見えます。

それで、私は本当にこれをどのように行うべきですか?

4

1 に答える 1

2

QModelIndex::data() の実装は、この動作を説明しています:

inline QVariant QModelIndex::data(int arole) const
{ return m ? m->data(*this, arole) : QVariant(); }

ここで、m はモデル インデックスのモデルです。

これはあなたの呼び出しを意味します

index.sibling(index.row(), 0).data(); 

TestResultsViewModel::data()つまり、結果として実際に「PASS」または「FAIL」が返されます。

これを回避するには、次のようにします。

QModelIndex firstColumnIndex = index.sibling( index.row(), 0 );
QVariant pass = QSqlQueryModel::data( firstColumnIndex );

QSqlQueryModel::data()これは、コードの代わりに明示的に呼び出しTestResultsViewModel::data()てスキップします

于 2012-06-12T14:09:24.483 に答える