2016-06-13 15 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::DisplayRoleQt::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(index、value、role)を返すべきではありません。 bool setData(...)の最後のステートメントで? –

関連する問題