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(); 

ends up calling TestResultsViewModel::data() again, meaning you indeed get "PASS" or "FAIL" as a result.

In order to avoid this, you can do the following:

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

This will explicitly call QSqlQueryModel::data() instead of TestResultsViewModel::data() and skip your code

于 2012-06-12T14:09:24.483 回答