Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > пример добавления,удаления узлов в TreeView


Автор: becks 21.5.2012, 11:25
Добрый день, коллеги, есть задача красиво отображать данные в виде дерева (если конкретно, то у каждого узла должна быть иконка и текст). Так же необходимо иметь возможность добавлять узлы на всех уровнях дерева, удалять узлы (и если это не лист, то удаляется вся ветка, находящаяся ниже узла),  редактировать узлы (менять текст узла и может быть иконку). В принципе все.

1) Подскажите, подойдет ли мне QTreeWidget или все же тут надо свою модель описывать и использовать QTreeView?
2) Хотелось бы увидеть простой примерчик подобной задачи (QTreeView + QStandardItemModel) , что-то нигде ничего подобного не нашел. Буду очень благодарен.

Спасибо.

Автор: _GRIN_ 21.5.2012, 22:43
Цитата(becks @  21.5.2012,  09:25 Найти цитируемый пост)
1) Подскажите, подойдет ли мне QTreeWidget или все же тут надо свою модель описывать и использовать QTreeView?


QTreeWidget - это по сути обёртка над QTreeView + QStandardItemModel =).

Цитата(becks @  21.5.2012,  09:25 Найти цитируемый пост)
удалять узлы (и если это не лист, то удаляется вся ветка, находящаяся ниже узла)

Когда удаляешь QStandardItem он удаляет все свои чайлды (аналогично для QTreeWidgetItem).

Цитата(becks @  21.5.2012,  09:25 Найти цитируемый пост)
у каждого узла должна быть иконка и текст

http://qt-project.org/doc/qt-4.8/qstandarditem.html#setIcon
http://qt-project.org/doc/qt-4.8/qstandarditem.html#setText

Цитата(becks @  21.5.2012,  09:25 Найти цитируемый пост)
2) Хотелось бы увидеть простой примерчик подобной задачи (QTreeView + QStandardItemModel) , что-то нигде ничего подобного не нашел. Буду очень благодарен.

Тут вообщем суть в том, что все манипуляции ты производишь в модели - а вью тебе пофиг - тролли за тебя уже позаботились, что бы вью модель адекватно отобразил.
взять корневой айтем: http://qt-project.org/doc/qt-4.8/qstandarditemmodel.html#invisibleRootItem
добавление новых строк (в строке может быть несколько полей) к айтему (узлу): http://qt-project.org/doc/qt-4.8/qstandarditem.html#appendRow
удаление из узла айтема (который в свою очередь тоже может быть узлом: http://qt-project.org/doc/qt-4.8/qstandarditem.html#removeRow

Корневой айтем можно и не брать а использовать обёртки: void QStandardItemModel::appendRow ( const QList<QStandardItem *> & items ) и тому подобные, которые внутри всё равно через корневой айтем работают.

P.S. Пример писать лень =). Из личного опыта советую всё-таки использовать вью+модель, а не виджет.

Автор: math64 22.5.2012, 07:10
Если дерево большое - лучше написать свою модель, стандартная будет работать медленно.
При использовании QTreeWidget в дизайнере его можно заполнить содержимым (в том числе иконки, всплывающие подсказки и т.п.). Посмотрев на сгенерерованный uic код, можно увидеть, как добавлять новые узлы.

Автор: borisbn 22.5.2012, 08:39
Цитата(_GRIN_ @  21.5.2012,  22:43 Найти цитируемый пост)
Из личного опыта советую всё-таки использовать вью+модель, а не виджет.

Цитата(math64 @  22.5.2012,  07:10 Найти цитируемый пост)
лучше написать свою модель

ну... можно и я проголосую за вью и модель, вместо стандартного виджета ?  smile 

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

Автор: becks 22.5.2012, 11:36
Всем большое спасибо за помощь! Так и поступлю  вью + модель, тем более за вчерашний день немного знания прокачал.

Подскажите еще по такому вопросу.

В зависимости от значения QComboBox  создавать в QGroupBox динамически некоторые виджеты (QLineEdit, QLabel). Добавляю их в layot, у QGroupBox устанавливаю этот layot.

Код

void entity_Dialog::on_entity_comboBox_currentIndexChanged(int index)
{
   QVBoxLayout *layot = new QVBoxLayout;

   if (index == 0)
      layot->addWidget(namelbl);
   else if ()
      layot->addWidget(nameedit);

   ui->groupBox->setLayout(layot);
}



Как при изменении значения QComboBox грамотно почистить layot у QGroupBox.
Спасибо.

Автор: borisbn 22.5.2012, 11:42
becks, нечестно так поступать с теми, кто в дальнейшем будет искать про layout'ы и удаление из них widget'ов:
найдя эту тему, они увидят, что тема про model/view и пойдут дальше.
Намёк понял  smile  ?
в правилах форума не зря сказано: один вопрос - одна тема

Автор: becks 22.5.2012, 12:00
Цитата(borisbn @ 22.5.2012,  11:42)
becks, нечестно так поступать с теми, кто в дальнейшем будет искать про layout'ы и удаление из них widget'ов:
найдя эту тему, они увидят, что тема про model/view и пойдут дальше.
Намёк понял  smile  ?
в правилах форума не зря сказано: один вопрос - одна тема

Намек понят ) Тема создана, кидаю ссылку для тех кто сюда заскочит.

http://forum.vingrad.ru/forum/act-ST/f-466/t-352237/unread-1.html

borisbn прошу в по новой теме подсказать!)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)