2012-06-12 45 views
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」或「失敗」而不是0,1,因此顏色不變。

那麼我該怎麼做呢?

回答

2

QModelIndex ::數據()的實現解釋這種行爲:

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

其中m是模型索引的模型。

這意味着你的

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

通話結束再打電話給TestResultsViewModel::data(),這意味着你確實獲得「PASS」或「失敗」的結果。

爲了避免這種情況,可以執行以下操作:

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

這將顯式調用QSqlQueryModel::data()代替TestResultsViewModel::data(),並跳過你的代碼

+0

這是完美的。謝謝! – Firedragon

+0

隨時。你可以跳過Qt :: DisplayRole參數,data()默認爲這個參數。我相應地編輯了答案。 –