Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Karl-Philipp от Сентябрь 26, 2008, 16:07



Название: editable tree model example - новые данные для модели
Отправлено: Karl-Philipp от Сентябрь 26, 2008, 16:07
Всем привет!

в примере Editable Tree Model хочу удалить данные модели, не трогая rootItem, и заполнить модель новыми данными из файла.
Для этого удаляю список дочерних TreeItem, после чего подсовываю новые данные, находящиеся в файле default1.txt:

Код:
void MainWindow::slotLoadNewData()
{
//удаляю список дочерних айтемов из rootItem
model->getRootItem()->getChildItems().clear();

QFile file(":/default1.txt");
file.open(QIODevice::ReadOnly);
model->setNewData(file.readAll());
file.close();

for (int column = 0; column < model->columnCount(); ++column)
view->resizeColumnToContents(column);

updateActions();
}
...
//в файле с моделью:
void TreeModel::setNewData(const QString &data)
{
setupModelData(data.split(QString("\n")), rootItem);
}

В результате получается, что на дереве остаются невидимые айтемы из предыдущей модели. Если в первой колонке кликнуть в месте их примерного нахождения - отображается индекс (в статусбаре), после двойного клика появляется текст айтема.
При этом данных в других колонках не существует.

Новые данные соответсвенно не показываются.

Подскажите, пожалуйста, куда копать?
Qt 4.4.1, VS2002


Название: Re: editable tree model example - новые данные для модели
Отправлено: Kolobok от Сентябрь 26, 2008, 22:28
Код:
void TreeModel::setNewData(const QString &data)
{
setupModelData(data.split(QString("\n")), rootItem);
        reset();
}


Название: Re: editable tree model example - новые данные для модели
Отправлено: Karl-Philipp от Сентябрь 26, 2008, 22:49
пробовал - не помогло...

таки чуть помогло - следа от предыдущих символов не осталось, а вот новые данные не показываются


Название: Re: editable tree model example - новые данные для модели
Отправлено: Kolobok от Сентябрь 27, 2008, 00:10
А новые данные есть?


Название: Re: editable tree model example - новые данные для модели
Отправлено: ритт от Сентябрь 27, 2008, 01:46
Код:
for (int column = 0; column < model->columnCount(); ++column)
view->resizeColumnToContents(column);
убило :)


Название: Re: editable tree model example - новые данные для модели
Отправлено: Karl-Philipp от Сентябрь 27, 2008, 08:19
Код:
for (int column = 0; column < model->columnCount(); ++column)
view->resizeColumnToContents(column);
убило :)
не стоит убиваться, это код из Ассистанта :) А что, собственно, убило?

А новые данные есть?
точно есть: файл с новыми данными присутствует и данные упаковываются.


Название: Re: editable tree model example - новые данные для модели
Отправлено: spirit от Сентябрь 27, 2008, 10:27
/*оффтоп
Цитировать
Код:
for (int column = 0; column < model->columnCount(); ++column)
view->resizeColumnToContents(column);
убило :)
не стоит убиваться, это код из Ассистанта :) А что, собственно, убило?
можно это одним методом сделать, если все колонки нужно по контенту выровнять
Цитировать
void QHeaderView::setResizeMode ( ResizeMode mode )
Sets the constraints on how the header can be resized to those described by the given mode.

т.е. в данном случае
Код:
....->setResizeMode (QHeaderView::ResizeToContents); 
*/


Название: Re: editable tree model example - новые данные для модели
Отправлено: Karl-Philipp от Сентябрь 27, 2008, 10:30
пасиб за ответ, но за что взял, за то продал :)
а вот данные перестали записываться в модель после того, как пытаюсь подсунуть новые из другого файла. Разберусь - напишу.


Название: Re: editable tree model example - новые данные для модели
Отправлено: spirit от Сентябрь 27, 2008, 10:35
а че нельзя дерево перестроить с самого начала,
если все чилды прибиваются и остается только один рут?


Название: Re: editable tree model example - новые данные для модели
Отправлено: Karl-Philipp от Сентябрь 27, 2008, 10:37
а че нельзя дерево перестроить с самого начала,
если все чилды прибиваются и остается только один рут?
так и делаю :)


Название: Re: editable tree model example - новые данные для модели
Отправлено: Karl-Philipp от Октябрь 02, 2008, 10:29
спасибо колобку, reset() модели помог. А данные не считывались из-за того, что в файле ресурсов не указал другой файл из которого надо считывать данные.

продолжаю разбирать пример editable tree model.
Возник вопрос по методу

Код:
void MainWindow::insertRow()
{
    QModelIndex index = view->selectionModel()->currentIndex();
    QAbstractItemModel *model = view->model();

    if (!model->insertRow(index.row()+1, index.parent()))
        return;

    updateActions();

    for (int column = 0; column < model->columnCount(index.parent()); ++column) {
        QModelIndex child = model->index(index.row()+1, column, index.parent());
        model->setData(child, QVariant("[No data]"), Qt::EditRole);
    }
}

на сколько я понял, сначала определяется место (индекс) куда вставлять, а затем с помощью insertRow() вставляется новый ряд. Дальше данные помещаются в модель, используя setData().

Возникает вопрос:
 
Цитировать
bool QAbstractItemModel::setData ( const QModelIndex & index, const QVariant & value, int role = Qt::EditRole )   [virtual]
Sets the role data for the item at index to value. Returns true if successful; otherwise returns false.
Для какого айтема вставляются ролевые данные, если вставился только ряд в модель, а про вставку айтемов в этот ряд речи не было ???
В модели QStandardItemModel все предельно просто: insertRow() вставляет список указателей на айтемы в нужное место, а как в данном примере? Помогите пожалуйста разобраться.


Название: Re: editable tree model example - новые данные для модели
Отправлено: Karl-Philipp от Октябрь 02, 2008, 11:15
похоже понял в чем дело:
вставляется ряд с помощью insertRow().

Код:
inline bool QAbstractItemModel::insertRow(int arow, const QModelIndex &aparent)
{ return insertRows(arow, 1, aparent); }

вызывается переопределенный в данной модели insertRows()

Прав ли я?


Название: Re: editable tree model example - новые данные для модели
Отправлено: Karl-Philipp от Октябрь 02, 2008, 11:51
да прав же! :)