crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Разбираюсь с моделями
miksayer
  опции профиля:
сообщение 29.11.2009, 13:49
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 33
Регистрация: 18.1.2009
Пользователь №: 495

Спасибо сказали: 0 раз(а)




Репутация:   0  


Задача стоит такая: написать модель для QTreeView, которая представляла бы собой дерево из "мнимых" путей к файлам, т.е. этих файлов на самом деле нет на диске(поэтому QDirModel не катит), т.е. я добавляю туда несолько путей типа "/dir1/dir2/file", а модель строит мне из них дерево. Плюс ко всему должно быть три столбца, в первом должно быть имя папки\файла, а во втором и третьем чекбокс и комбобокс соответственно(причем их значения можно менять и у папок, и у файлов). Я начал разбираться с документацией и стандартным примером и сразу возникли вопросы:
1. Класс элемента там описан так:
class TreeItem
{
public:
    TreeItem(const QList<QVariant> &data, TreeItem *parent = 0);
    ~TreeItem();

    void appendChild(TreeItem *child);

    TreeItem *child(int row);
    int childCount() const;
    int columnCount() const;
    QVariant data(int column) const;
    int row() const;
    TreeItem *parent();

private:
    QList<TreeItem*> childItems;
    QList<QVariant> itemData;
    TreeItem *parentItem;
};

Могу ли я вместо QList<QVariant> itemData; написать что-то вроде такого:
class TreeItem
{
public:
struct ItemData
{
    QString path;
    bool needDownload;
    int priority;
}
//...............
private:
//.................
ItemData itemData;
}

? т.е. можно использовать вместо списка структуру и работать с ней(что имхо более логично)?
2. Как мне правильно описать setData, который мне необходимо описать(судя по документации)?
3. Правильно ли реализован метод flags для моего случая:
Qt::ItemFlags FilesTreeModel::flags(const QModelIndex &index) const
{
    if (!index.isValid())
        return 0;

    return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable;
}

?
4. Как добавлять виджеты(в моем случае чекбоксы и комбобоксы) в столбцы?

Сообщение отредактировал miksayer - 29.11.2009, 14:00
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 29.11.2009, 16:55
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(miksayer @ 29.11.2009, 16:49) *
? т.е. можно использовать вместо списка структуру и работать с ней(что имхо более логично)?
Цитата(miksayer @ 29.11.2009, 16:49) *
Могу ли я вместо QList<QVariant> itemData; написать что-то вроде такого:
тогда у тебя получится только один элемент-хранилище данных, а в оригинале был контейнер, в который можно добавлять много элементов.
Можно сделать структуру (описывающую один элемент) и список указателей на такие структуры (т.е. уже много элементов).

Цитата(miksayer @ 29.11.2009, 16:49) *
2. Как мне правильно описать setData, который мне необходимо описать(судя по документации)?
этот метод нужен для помещения данных в хранилище. Т.е. пользователь дважды щёлкает по элементу, открывается виджет редактор, после завершения редактирования делегат (обслуживающий этот элемент) закрывает редактор и пытается сохранить изменения вызывая метод модели setData (в оригинальном примере данные отправляются в контейнер itemData)

Цитата(miksayer @ 29.11.2009, 16:49) *
4. Как добавлять виджеты(в моем случае чекбоксы и комбобоксы) в столбцы?
эта тема уже обсуждалась, и, вроде, имеются примеры кода на форуме.
Тема вобщем-то отдельная.


П.С. Я бы рекомендовал вернутся к ней после решения всех предыдущих задач
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
miksayer
  опции профиля:
сообщение 29.11.2009, 17:14
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 33
Регистрация: 18.1.2009
Пользователь №: 495

Спасибо сказали: 0 раз(а)




Репутация:   0  


спасибо за ответ. Я тут немного переписал под себя модель из примера. Главные изменения здесь:
void FilesTreeModel::setupModelData(libtorrent::file_storage const& files, FilesTreeItem *parent)
{

    for (libtorrent::file_storage::iterator itr = files.begin(); itr != files.end(); itr++)
    {
        QList<QVariant> l;
        l << QString(itr.string()) << tr("hi2") << tr("hi3");
        parent->appendChild(new FilesTreeItem(l, parent));
    }
}

Т.е. по идее должно выводить в столбец содержимое files(libtorrent::file_storage - это контейнер из сторонней библиотеки), но почему-то ничего не выводиться. В аттаче полный код классов FilesTreeModel и FilesTreeItem(хотя я больше почти ничего не менял). Подскажите, пожалуйста, что не так

Цитата(Litkevich Yuriy @ 29.11.2009, 16:55) *
(в оригинальном примере данные отправляются в контейнер itemData)

в оригинальном примере вообще нет этого метода
Прикрепленные файлы
Прикрепленный файл  model.tar.gz ( 1.78 килобайт ) Кол-во скачиваний: 304
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 29.11.2009, 17:21
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(miksayer @ 29.11.2009, 20:14) *
в оригинальном примере вообще нет этого метода
я имел в виду оригинальный контейнер в котором хранятся данные.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
miksayer
  опции профиля:
сообщение 30.11.2009, 10:09
Сообщение #5


Студент
*

Группа: Участник
Сообщений: 33
Регистрация: 18.1.2009
Пользователь №: 495

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(Litkevich Yuriy @ 29.11.2009, 17:21) *
я имел в виду оригинальный контейнер в котором хранятся данные.

понятно, а что насчет моей модели?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 24.4.2024, 20:51