2016-06-13 24 views
5

mamJak zmienić kolor elementów QStringListModel?

QListView *myListView; 
QStringList *myStringList; 
QStringListModel *myListModel; 

którą zapełnić danymi tak:

myStringList->append(QString::fromStdString(...)); 
myListModel->setStringList(*myStringList); 
myListView->setModel(myListModel); 

Chcę zmienić font-kolor niektórych pozycji listy, więc próbowałem:

for (int i = 0; i < myListModel->rowCount(); ++i) { 
    std::cerr << myListModel->index(i).data().toString().toStdString() << std::endl; 
    myListModel->setData(myListModel->index(i), QBrush(Qt::green), Qt::ForegroundRole); 
} 

Dane są drukowane poprawnie, ale kolor się nie zmienia. czego mi brakuje?

Odpowiedz

6

QStringListModel obsługuje tylko role Qt::DisplayRole i Qt::EditRole. Aby uzyskać wsparcie dla innych ról, należy ponownie zastosować metody QStringListModel::data() i QStringListModel::setData().

przykład:

class CMyListModel : public QStringListModel 
{ 
public: 
    CMyListModel(QObject* parent = nullptr) 
     : QStringListModel(parent) 
    {} 

    QVariant data(const QModelIndex & index, int role) const override 
    { 
     if (role == Qt::ForegroundRole) 
     { 
      auto itr = m_rowColors.find(index.row()); 
      if (itr != m_rowColors.end()); 
       return itr->second; 
     } 

     return QStringListModel::data(index, role); 
    } 

    bool setData(const QModelIndex & index, const QVariant & value, int role) override 
    { 
     if (role == Qt::ForegroundRole) 
     { 
      m_rowColors[index.row()] = value.value<QColor>(); 
      return true; 
     } 

     return QStringListModel::setData(index, value, role); 
    } 
private: 
    std::map<int, QColor> m_rowColors; 
}; 
+1

Ima, lepiej jest użyć 'QIdentityProxyModel' dla takich przypadków. –

+0

Dzięki to działa! Ale nie powinien to być powrót QStringListModel :: setData (indeks, wartość, rola); w ostatnim zestawieniu bool setData (...)? –