Russian Qt Forum

Qt => Model-View (MV) => Тема начата: asvil от Март 21, 2010, 18:21



Название: QAbstractItemModel::setItemData проблема
Отправлено: asvil от Март 21, 2010, 18:21
Код:
bool QAbstractItemModel::setItemData(const QModelIndex &index, const QMap<int, QVariant> &roles)
{
    bool b = true;
    for (QMap<int, QVariant>::ConstIterator it = roles.begin(); it != roles.end(); ++it)
        b = b && setData(index, it.value(), it.key());
    return b;
}

Qt 4.6.1
gcc (Ubuntu 4.3.3-5ubuntu4) 4.3.3

Допустим в QMap два элемента.
Допустим на первой итерации цикла setData возвращает false.
На второй итерации setData НЕ вызывается.
Это оптимизация gcc? А как ее отключить?
Я переопределил setItemData, но хотелось бы минимально вмешиваться в уже созданное в qt.


Название: Re: QAbstractItemModel::setItemData проблема
Отправлено: Igors от Март 21, 2010, 18:44
Код:
bool QAbstractItemModel::setItemData(const QModelIndex &index, const QMap<int, QVariant> &roles)
{
    bool b = true;
    for (QMap<int, QVariant>::ConstIterator it = roles.begin(); it != roles.end(); ++it)
        b = b && setData(index, it.value(), it.key());
    return b;
}
setData не вызовется никогда если "b" уже true. Сначала язык, потом умные итераторы

Edit: правильно "setData не вызовется никогда если "b" уже false. То есть первый возврат setData = false делает дальнейшие проверки бессмысленными.


Название: Re: QAbstractItemModel::setItemData проблема
Отправлено: BRE от Март 21, 2010, 18:52
setData не вызовется никогда если "b" уже true. Сначала язык, потом умные итераторы
Почему?


Название: Re: QAbstractItemModel::setItemData проблема
Отправлено: lit-uriy от Март 21, 2010, 18:52
>>Это оптимизация gcc?
скорее всего.
Попробуй поменять местами аргументы оператора "&&"


Название: Re: QAbstractItemModel::setItemData проблема
Отправлено: lit-uriy от Март 21, 2010, 18:53
>>если "b" уже true
наверное имелось в виду "false"


Название: Re: QAbstractItemModel::setItemData проблема
Отправлено: Igors от Март 21, 2010, 19:06
Почему?
Спасибо, поправился  :)