Russian Qt Forum

Qt => Model-View (MV) => Тема начата: magog от Февраль 16, 2012, 14:29



Название: Не отображаются итемы в кастомной моделе.
Отправлено: magog от Февраль 16, 2012, 14:29
итем: http://paste.pocoo.org/show/551849/
модель: http://paste.pocoo.org/show/551850/
минимал репродьюс: http://dl.dropbox.com/u/25249431/test.zip

Хидер отображается. Итем добавляется и по дебагам это отслеживается. Но в модели не показывается.


Название: Re: Не отображаются итемы в кастомной моделе.
Отправлено: Bepec от Февраль 16, 2012, 14:32
Кхм. Сразу 2 куска кода. Интересно, кто нибудь их посмотрит?


Название: Re: Не отображаются итемы в кастомной моделе.
Отправлено: magog от Февраль 16, 2012, 14:33
Я тут первый раз спрашиваю - пока не в курсе как тут и на что реагируют


Название: Re: Не отображаются итемы в кастомной моделе.
Отправлено: Bepec от Февраль 16, 2012, 14:41
Уважаемый магог, не объясните мне сакральный смысл кода?

Код:
	TreeModel::TreeModel (const QStringList& headers, QObject *parent)
: QAbstractItemModel (parent)
, RootItem_ (0)
{
QVector<QVariant> rootData;
std::for_each (headers.begin (), headers.end (),
[&rootData] (decltype (headers.front ()) header)
{
rootData << header;
});

RootItem_ = new TreeItem (rootData);
}
 

??? я просто озадачен, если не сказать более.

Ведь можно и так:
Код:
TreeModel::TreeModel (const QStringList& headers, QObject *parent)
: QAbstractItemModel (parent)
, RootItem_ (0)
{
QVector<QVariant> rootData;
rootData << headers;

RootItem_ = new TreeItem (rootData);
}

update: вот про это
Код:
std::for_each (headers.begin (), headers.end (),
[&rootData] (decltype (headers.front ()) header)
подробнее, если можно. Ниразу такого не встречал, к тому же у меня оно не компилится и недоумевает по поводу "[&rootData] (decltype (headers.front ()) header)"


Название: Re: Не отображаются итемы в кастомной моделе.
Отправлено: sudo от Февраль 16, 2012, 14:42
Кто будет компилить, собирается только под 4.8


Название: Re: Не отображаются итемы в кастомной моделе.
Отправлено: Bepec от Февраль 16, 2012, 14:43
Печально как то...


Название: Re: Не отображаются итемы в кастомной моделе.
Отправлено: Пантер от Февраль 16, 2012, 14:43
Bepec, это с++11.


Название: Re: Не отображаются итемы в кастомной моделе.
Отправлено: magog от Февраль 16, 2012, 14:45
Я не нашел в доках оператора для добавления в вектор вариантов стринглиста.


Название: Re: Не отображаются итемы в кастомной моделе.
Отправлено: magog от Февраль 16, 2012, 14:46
И как я и предполагал - оно не работает тогда. Хоть и компилируется


Название: Re: Не отображаются итемы в кастомной моделе.
Отправлено: sudo от Февраль 16, 2012, 14:49
Если честно, разбираться не очень хочется. Потому что много букв и мягко говоря непривычный стиль кода. Но! Метод data() не вызывается от слова совсем (исключение - уменьшить окно до появления прокрутки и ей подвигать)


Название: Re: Не отображаются итемы в кастомной моделе.
Отправлено: Bepec от Февраль 16, 2012, 14:50
Работает оно.
Но раз тут С++11  + Qt8 пошёл, то это жесть какая то ^.^

PS работает и компилится для Qt 4.7.2 ;)


Название: Re: Не отображаются итемы в кастомной моделе.
Отправлено: sudo от Февраль 16, 2012, 14:52
У меня системный 4.7.4 отказался собирать.

В общем, метод rowCount всегда возвращает 0, поэтому нужно смотреть итемы
нагнал, надо было кнопочку понажимать :)


Название: Re: Не отображаются итемы в кастомной моделе.
Отправлено: magog от Февраль 16, 2012, 14:54
Там лямбда используется в качестве функтора.


Название: Re: Не отображаются итемы в кастомной моделе.
Отправлено: Bepec от Февраль 16, 2012, 14:56
Думаю человек просто не разобрался с Model-View и рубит с плеча.

Правда используется незнакомый мне С++11 и стиль программирования ммм...

Стиль программирования такого типа недавно обсуждался на хабре, но мной был забракован за нечитабельностью и сложностью для понимания ;)


Название: Re: Не отображаются итемы в кастомной моделе.
Отправлено: Пантер от Февраль 16, 2012, 14:56
Это не стиль программирования - это новый стандарт языка с++.


Название: Re: Не отображаются итемы в кастомной моделе.
Отправлено: Bepec от Февраль 16, 2012, 14:57
Не, непонятные мне моменты - это С++11. А умышленные отступы - это стиль программирования.


Название: Re: Не отображаются итемы в кастомной моделе.
Отправлено: magog от Февраль 16, 2012, 14:59
Думаю человек просто не разобрался с Model-View и рубит с плеча.

Правда используется незнакомый мне С++11 и стиль программирования ммм...

Стиль программирования такого типа недавно обсуждался на хабре, но мной был забракован за нечитабельностью и сложностью для понимания ;)

1. Тоесть в чем причина Вы не знаете, поэтому пусть во всем виноват я. Ок.
2. С каких пор программисту стал важен стиль, что бы разобраться в коде? И да - не вижу ни одного места, страшного, если так можно сказать.
3. Аргументы будут да и вообще? Не можете оказать помощь из-за стиля - проходите мимо


Название: Re: Не отображаются итемы в кастомной моделе.
Отправлено: Bepec от Февраль 16, 2012, 15:00
Агриться не стоит. Я только с anrew.k собачусь :D

Простой вопрос - вы писали ранее уже свою модель? простейшую?


Название: Re: Не отображаются итемы в кастомной моделе.
Отправлено: magog от Февраль 16, 2012, 15:01
Это моя первая модель для дерева. Обычные таблицы писал и все ок работает.


Название: Re: Не отображаются итемы в кастомной моделе.
Отправлено: sudo от Февраль 16, 2012, 15:17
В общем, не осилил, переписав чуть ли не половину кода :D Будет время, может поковыряю


Название: Re: Не отображаются итемы в кастомной моделе.
Отправлено: magog от Февраль 16, 2012, 15:18
Да что там переписывать пришлось? там 1 лямбда и 2 инит списка. Вот и все


Название: Re: Не отображаются итемы в кастомной моделе.
Отправлено: Bepec от Февраль 16, 2012, 15:24
В принципе всё понятно. (частично, могу и ошибаться)

У тебя просто никогда не возвращается верный индекс...

Даже если посмотреть - у тебя нет элементарных проверок на наличие чилдренов, ты просто берёшь 0 элемент из 0 массива и пытаешься вернуть на него индекс Оо...
Соответственно, ничего и не появляется.

Мой тебе совет - не мчись сразу в "я хочу полный функционал".

А сделай проще - сначала модель с заглушками и только Top Item'aми, потом уже добавляй функционал.

update: да переписать я переписал, не проблема.

У тебя все данные пытаются взяться с твоего "Item'a", который на тот момент пустой :/


Название: Re: Не отображаются итемы в кастомной моделе.
Отправлено: magog от Февраль 16, 2012, 15:29
Куда уже примитивнее? Добавляется итем. Добавляется только в верхний уровень. И пример практически буква в букву - examples. Но почему-то не показывает ничего


Название: Re: Не отображаются итемы в кастомной моделе.
Отправлено: Bepec от Февраль 16, 2012, 15:33
Код:
QModelIndex TreeModel::index (int row, int column, const QModelIndex& parent) const
{
if (!hasIndex (row, column,parent))
return QModelIndex();

// никкогда не доходит до сюда. почему? хз. разбираться особо неохота.
TreeItem *parentItem = GetItem (parent);
        parentItem->AddChild(RootItem_);

// Если 1 условие убрать, то ты берёшь вот здесь указатель на 0 элемент из массива в 0 элементов (проще говоря куда то указателем тыркаешь, непонятно куда)
TreeItem *childItem = parentItem->Child (row);
// и самое интересное, указатель то у тебя существует, и поэтому ты делаешь какой то бред...
if (childItem)
return createIndex (row, column, childItem);
else
return QModelIndex ();
}

Помоему проще новую модель написать с 0, чем выяснять что тут у тебя творится...


Название: Re: Не отображаются итемы в кастомной моделе.
Отправлено: magog от Февраль 16, 2012, 15:44
Сейчас это и пытаюсь сделать.


Название: Re: Не отображаются итемы в кастомной моделе.
Отправлено: Bepec от Февраль 16, 2012, 15:45
(2 поста подряд плохо, зато внимание привлекает. Прошу не бить ^,^ )

У тебя сейчас попытка построить древовидную модель с 1 топИтемом + 5 итемов 2 уровня.
Причём есть функционал:
+  добавления,
+ удаления,
+ вставки строк .
+ название столбцов, количество столбцов/строк берётся именно из топИтема (для всей модели), что категорически рубит всю модель
+ индекс у тебя вычисляется непонятным образом
+ каждый раз при вызовах ТопИтема, ты зачем то создаёшь на него указатель
+ в функции возврата индекса ты берёшь 0 элемент из 0 массива
+ из этого несуществующего указателя на элемент ты берёшь ещё аж целых 3 параметра

В результате твоя программа, при правильной работе % на 250 упала бы, и дай боже, если б не потянула за собой IDE ;)

Тут надо переписывать почти всё. Проще заного сделать простую модель с 1 айтемом.

update: могу завтра попробовать накидать тебе тестовую древовидную модель, но только если ты изъявишь желание ;)


Название: Re: Не отображаются итемы в кастомной моделе.
Отправлено: magog от Февраль 16, 2012, 15:47
Не надо. Я сам себе могу накидать. Спасибо.


Название: Re: Не отображаются итемы в кастомной моделе.
Отправлено: Bepec от Февраль 16, 2012, 15:50
Пожалуйста, приходи ещё ;)