2016-06-13 2 views
5

У меня естьКак изменить цвет элементов QStringListModel?

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

который я заполнить данные, как это:

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

Я хочу изменить цвет шрифта некоторых элементов списка, так что я пробовал:

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

Данные распечатываются корректно, но цвет не изменяется. Что мне не хватает?

ответ

6

QStringListModel поддерживает только Qt::DisplayRole и Qt::EditRole роли.

Вам необходимо переопределить методы QStringListModel::data() и QStringListModel::setData() для поддержки других ролей.

Пример:

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

Имо, то лучше использовать 'QIdentityProxyModel' для таких случаев. –

+0

Спасибо, что работает! Но не следует возвращать QStringListModel :: setData (индекс, значение, роль); в последнем утверждении bool setData (...)? –