2016-06-13 28 views
5

HoCome modificare il colore degli elementi di QStringListModel?

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

che riempio con i dati in questo modo:

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

voglio cambiare il tipo di carattere, colore di alcune voci dell'elenco, così ho provato:

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

I dati vengono stampati correttamente, ma il colore non cambia. Cosa mi manca?

risposta

6

QStringListModel supporta solo i ruoli Qt::DisplayRole e Qt::EditRole.

È necessario reimplementare i metodi QStringListModel::data() e QStringListModel::setData() per supportare altri ruoli.

Esempio:

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

Imo, è meglio usare 'QIdentityProxyModel' per tali casi. –

+0

Grazie funziona! Ma non dovrebbe essere restituito QStringListModel :: setData (index, value, role); nell'ultima istruzione di bool setData (...)? –

Problemi correlati