Читаю http://qtdocs.narod.ru/, раздел создание новых моделей...
Источник данных у нас QStringList, значит можно унаследоваться от QAbstractListModel, что и делается в объяснении...
Наследуюсь:
[B]mystringlistmodel.h[/B]
class MyStringListModel : public QAbstractListModel
{
Q_OBJECT
public:
explicit MyStringListModel(QStringList &strings, QObject *parent = 0);
private:
QStringList stringList;
};
[B]mystringlistmodel.cpp[/B]
MyStringListModel::MyStringListModel(QStringList &strings,QObject *parent) :
QAbstractListModel(parent)
{
stringList<<strings;
}
Определяя конструктор сталкиваюсь с проблемой, что не могу инициализировать приватную переменную QStringList stringList
stringList(strings);
no match for call to '(QStringList) (QStringList&)'
а вот таким образом могу:
stringList<<strings;
Хорошо, далее....
Написано, что "Кроме конструктора модели, мы должны реализовать только две функции: rowCount(), data()". Зачем, если я могу ни разу эти функции не вызвать?
Далее они переопределяют виртуальный метод rowCount(), ну и я собственно у себя этот метод в классе епреопределяю:
int StringListModel::rowCount(const QModelIndex &parent) const
{
return stringList.count();
}
Вот только зачем туда подавать QModelIndex &parent, если мы его нигде не спользуем?
Хорошо, допустим далее, я хочу посмотреть что у меня получилось, беру свою модель, беру представление (QListView) и отображаю все это на виджете...
QStringList stringlist;
stringlist << "One" << "Two" << "Three" << "Four" << "Five";
MyStringListModel *mystringlistmodel = new MyStringListModel(stringlist,this);
QListView *listview = new QListView(this);
listview->setModel(mystringlistmodel);
Допустим я не зря переопределил виртуальный метод класса QAbstractListModel rowCount(const QModelIndex &parent), как теперь мне узнать количество строк в моей модели?
qDebug() << mystringlistmodel->rowCount();[
Метод требует QModelIndex &parent, что туда подать?
QModelIndex parent = mystringlistmodel->index(0,0,QModelIndex());
?Далее, нам в руководстве предлагается переопределить еще один виртуальный метод data();
QVariant StringListModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
if (index.row() >= stringList.size())
return QVariant();
if (role == Qt::DisplayRole)
return stringList.at(index.row());
else
return QVariant();
}
И тут у меня ступор, если index не валидный(первое if()), то что возвращается? Аналогично, что возвращается, если срабатывает второй if()? Рандомное число? А может лучше вернуть что-нить такое, чтобы понять что идекс не валидный, или индекс вернулся больше количества срок в stringList?
В общем, как-то все жутко на первых порах...