Russian Qt Forum
Ноябрь 24, 2024, 16:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Работа с индексами в модели QStandardItemModel  (Прочитано 10405 раз)
Waryable
Гость
« : Ноябрь 28, 2008, 12:18 »

Имеется:
Код
C++ (Qt)
QModelIndex index;
QStandardItemModel *model = new QStandardItemModel;
for ( int nRow = 0; nRow < 3; ++nRow )
{
index = model -> index( nRow, 0 );
model -> setData(index, str );
}
Проблема в том, что метод model -> index( nRow, 0 ); не возвращает валидный индекс. Конкретнее, при любых значениях аргументов индекс указывает на -1 строку и -1 столбец, указатель р всегда равен нулю. 
Примеров работы с индексами в ассистенте не нашел(возможно плохо искал). В учебниках примеры есть, но почему-то проблема та же - индексы получаю не валидные.
« Последнее редактирование: Ноябрь 28, 2008, 13:03 от Waryable » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Ноябрь 28, 2008, 12:34 »

Для получения индекса нужно, чтобы были данные. А ты делаешь все наоборот. Читай про заполнение модели в ассистенте.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Waryable
Гость
« Ответ #2 : Ноябрь 28, 2008, 12:50 »

В том то и дело, что мне надо заполнить модель.
Код
C++ (Qt)
model -> index( nRow, 0 );
Поидее методу надо задать еще третий аргумент - указатель на предка. Для создания первого элемента модели, поидее, надо вызвать этот матод таким образом:
Код
C++ (Qt)
model -> index( nRow, 0, &parent ).
Проблема в том, что не смог найти как получить parent.
« Последнее редактирование: Ноябрь 28, 2008, 13:03 от Waryable » Записан
Karl-Philipp
Гость
« Ответ #3 : Ноябрь 28, 2008, 13:31 »

Имеется:
Код
C++ (Qt)
QModelIndex index;
QStandardItemModel *model = new QStandardItemModel;
for ( int nRow = 0; nRow < 3; ++nRow )
{
index = model -> index( nRow, 0 );
model -> setData(index, str );
}
Проблема в том, что метод model -> index( nRow, 0 ); не возвращает валидный индекс...

ты создал модель, но ты же не указал, сколько в ней строк и колонок (не заполнил её айтемами)! Откуда модель возьмёт требуемый тебе индекс  Непонимающий

Сперва либо создай айтемы и помести их в модель, либо сразу создавай модель с требуемым числом строк и колонок:
Цитировать
QStandardItemModel ( int rows, int columns, QObject * parent = 0 )

Глянь ассистант про QStandardItemModel, там очень хорошо видно Улыбающийся

P.S. В твоём случае parent при заполнении не при чём.
« Последнее редактирование: Ноябрь 28, 2008, 13:45 от terlan » Записан
Waryable
Гость
« Ответ #4 : Декабрь 01, 2008, 10:23 »

Приветствую. Спасибо за ответы. С предками разобрался. Но сколько не курил асистент и другие учебники, так и не понял, как решить мою задачу.
Создана модель дерева QStandardItemModel. В ней созданы три корневых итема. Задача реализовать возможность добавления отдельных итемов к каждому из корневых итемов.
Все было бы просто, если б добавление можно было производить таким образом: model.insertItem(index, item); , где index - индекс корневого итема, item - добавляемый итем. Но, к сожалению, это только лишь мои мечты  Веселый
Записан
Karl-Philipp
Гость
« Ответ #5 : Декабрь 01, 2008, 11:04 »

...
Создана модель дерева QStandardItemModel. В ней созданы три корневых итема. Задача реализовать возможность добавления отдельных итемов к каждому из корневых итемов.
...
данная возможность уже реализована!
приблизительно будет выглядеть так:
Код:
...
QModelIndex index;
QStandardItemModel* model = new QStandardItemModel(3, 1);

index = model->index(i, 0); //выбираешь нужный ряд в модели (корневой айтем)
model->itemFromIndex(index)->appendRow( new QStandardItem() );//прикрепляешь новый айтем
...
Записан
Waryable
Гость
« Ответ #6 : Декабрь 01, 2008, 11:21 »

 
Код
C++ (Qt)
QModelIndex index;
QStandardItemModel* model = new QStandardItemModel(3, 1);
 
index = model->index(i, 0); //выбираешь нужный ряд в модели (корневой айтем)
model->itemFromIndex(index)->appendRow( new QStandardItem() );//прикрепляешь новый айтем
Господа, ну что у вас за привычка, я только найду решение, иду отписываться, а тут вы уже его запостили!!!  Веселый Шутка  Подмигивающий Точно такое решение я уже реализовал. Спасибо terlan.
Записан
ритт
Гость
« Ответ #7 : Декабрь 01, 2008, 15:26 »

в следующий раз попробуй искать решение _до_ того, как постишь здесь.
Записан
Waryable
Гость
« Ответ #8 : Декабрь 02, 2008, 09:34 »

в следующий раз попробуй искать решение _до_ того, как постишь здесь.
Странное заявление. Пока решение не найдено, неизвестно сколько уйдет времени на его поиск. В то время как, можно отписать свою проблему здесь, что дает большую вероятность того, что решение будет найдено быстрее. Так в чем проблема то?
Записан
ритт
Гость
« Ответ #9 : Декабрь 02, 2008, 11:31 »

тратишь чужое время, а стОит шевельнуть мозгой - и сам решение находишь.
Записан
Waryable
Гость
« Ответ #10 : Декабрь 02, 2008, 12:18 »

Стало еще более странно. Здесь все в конечном счете тратят чужое время. Я потому и задаю вопрос в теме для новичков, что на Qt только начинаю программировать. Вопросы выглядят тривиальными для тех, кто уже на "ты" со средой. Я еще не дотянул до такого уровня. Мозгой я шевелил и когда вопрос задавал, и после этого. Когда сам нашел решение, отписал здесь. Поблагодарил всех, и немного отшутился. А вашы посты немного здесь не в тему.
ЗЫ: начался флуд...   
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.138 секунд. Запросов: 23.