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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: editable tree model example - новые данные для модели  (Прочитано 8654 раз)
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
Записан
Kolobok
Гость
« Ответ #1 : Сентябрь 26, 2008, 22:28 »

Код:
void TreeModel::setNewData(const QString &data)
{
setupModelData(data.split(QString("\n")), rootItem);
        reset();
}
Записан
Karl-Philipp
Гость
« Ответ #2 : Сентябрь 26, 2008, 22:49 »

пробовал - не помогло...

таки чуть помогло - следа от предыдущих символов не осталось, а вот новые данные не показываются
« Последнее редактирование: Сентябрь 26, 2008, 22:56 от terlan » Записан
Kolobok
Гость
« Ответ #3 : Сентябрь 27, 2008, 00:10 »

А новые данные есть?
Записан
ритт
Гость
« Ответ #4 : Сентябрь 27, 2008, 01:46 »

Код:
for (int column = 0; column < model->columnCount(); ++column)
view->resizeColumnToContents(column);
убило Улыбающийся
Записан
Karl-Philipp
Гость
« Ответ #5 : Сентябрь 27, 2008, 08:19 »

Код:
for (int column = 0; column < model->columnCount(); ++column)
view->resizeColumnToContents(column);
убило Улыбающийся
не стоит убиваться, это код из Ассистанта Улыбающийся А что, собственно, убило?

А новые данные есть?
точно есть: файл с новыми данными присутствует и данные упаковываются.
« Последнее редактирование: Сентябрь 27, 2008, 08:23 от terlan » Записан
spirit
Гость
« Ответ #6 : Сентябрь 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); 
*/
« Последнее редактирование: Сентябрь 27, 2008, 10:33 от spirit » Записан
Karl-Philipp
Гость
« Ответ #7 : Сентябрь 27, 2008, 10:30 »

пасиб за ответ, но за что взял, за то продал Улыбающийся
а вот данные перестали записываться в модель после того, как пытаюсь подсунуть новые из другого файла. Разберусь - напишу.
« Последнее редактирование: Сентябрь 27, 2008, 10:39 от terlan » Записан
spirit
Гость
« Ответ #8 : Сентябрь 27, 2008, 10:35 »

а че нельзя дерево перестроить с самого начала,
если все чилды прибиваются и остается только один рут?
Записан
Karl-Philipp
Гость
« Ответ #9 : Сентябрь 27, 2008, 10:37 »

а че нельзя дерево перестроить с самого начала,
если все чилды прибиваются и остается только один рут?
так и делаю Улыбающийся
Записан
Karl-Philipp
Гость
« Ответ #10 : Октябрь 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() вставляет список указателей на айтемы в нужное место, а как в данном примере? Помогите пожалуйста разобраться.
Записан
Karl-Philipp
Гость
« Ответ #11 : Октябрь 02, 2008, 11:15 »

похоже понял в чем дело:
вставляется ряд с помощью insertRow().

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

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

Прав ли я?
« Последнее редактирование: Октябрь 02, 2008, 11:40 от terlan » Записан
Karl-Philipp
Гость
« Ответ #12 : Октябрь 02, 2008, 11:51 »

да прав же! Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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