Russian Qt Forum

Qt => Вопросы новичков => Тема начата: billy4685 от Апрель 08, 2015, 14:59



Название: Как в QTreeWidget редактировать конкретный item, не зная его индекс?
Отправлено: billy4685 от Апрель 08, 2015, 14:59
Здравствуйте, заинтересовал такой вопрос. Как в QTreeWidget редактировать конкретный item, не зная его индекс? Нет ли qt-ой функции для изменение одного item-а другим (чтобы не требовала указывать индекс)?  Также интересует вопросы: как удалять конкретный item? как добавлять item в конец? Просто нахожу в qt только подобные функции, где в качестве параметров задаются индекс и сам item.


Название: Re: Как в QTreeWidget редактировать конкретный item, не зная его индекс?
Отправлено: billy4685 от Апрель 08, 2015, 15:05
Ах да, так же интересует вопрос: "Как добавить item в QTreeWidget после конкретного item-а, не зная индекс второго?".


Название: Re: Как в QTreeWidget редактировать конкретный item, не зная его индекс?
Отправлено: Zerkin от Апрель 08, 2015, 16:01
Конкретизируйте ситуацию, из-за которой вы не знаете индекс уже присутствующего элемента в дереве. Мне кажется это странным.  ???


Название: Re: Как в QTreeWidget редактировать конкретный item, не зная его индекс?
Отправлено: Zerkin от Апрель 08, 2015, 16:06
Здравствуйте, заинтересовал такой вопрос. Как в QTreeWidget редактировать конкретный item, не зная его индекс? Нет ли qt-ой функции для изменение одного item-а другим (чтобы не требовала указывать индекс)?  Также интересует вопросы: как удалять конкретный item? как добавлять item в конец? Просто нахожу в qt только подобные функции, где в качестве параметров задаются индекс и сам item.

У стандартного QTreeWidgetItem'a нету методов для работы с сиблингами, только с чайлдами. Но всё возможно сделать через parent'ов и topLevelItems. У самого QTreeWidget есть следующие механизмы, с помощью которых можно к элементам обратиться:
Код
C++ (Qt)
QTreeWidgetItem * itemAbove ( const QTreeWidgetItem * item ) const
QTreeWidgetItem * itemAt ( const QPoint & p ) const
QTreeWidgetItem * itemAt ( int x, int y ) const
QTreeWidgetItem * itemBelow ( const QTreeWidgetItem * item ) const
QTreeWidgetItem * topLevelItem ( int index ) const
QList<QTreeWidgetItem *> selectedItems () const
QTreeWidgetItem * currentItem () const
 


Название: Re: Как в QTreeWidget редактировать конкретный item, не зная его индекс?
Отправлено: gil9red от Апрель 08, 2015, 16:18
Как в QTreeWidget редактировать конкретный item, не зная его индекс?
http://doc.qt.io/qt-4.8/qtreewidget.html#editItem

Нет ли qt-ой функции для изменение одного item-а другим (чтобы не требовала указывать индекс)?
Что вы подразумеваете?

как удалять конкретный item?
Набросал в браузере алгоритм:
Код
C++ (Qt)
QTreeWidgetItem * parent = item->parent();
if (parent)
   parent->removeChild(item);
else {
   int i = tree->indexOfTopLevelItem(item);
   delete tree->takeTopLevelItem(i);
}
 

как добавлять item в конец?
Набросал в браузере алгоритм:
Код
C++ (Qt)
QTreeWidgetItem * parent = item->parent();
if (parent)
   parent->addChild(item);
else
   tree->addTopLevelItem(item);
 

Цитата: billy4685
Ах да, так же интересует вопрос: "Как добавить item в QTreeWidget после конкретного item-а, не зная индекс второго?".
Так же как и добавление в конец, но используйте функцию insert* как найти индекс элемента вы знаете


Название: Re: Как в QTreeWidget редактировать конкретный item, не зная его индекс?
Отправлено: billy4685 от Апрель 08, 2015, 16:39
Конкретизируйте ситуацию, из-за которой вы не знаете индекс уже присутствующего элемента в дереве. Мне кажется это странным.  ???
Да просто переписываю прогу со среды Photon Application Builder на Qt. А там как раз в PtTree (аналог QTreeWidget) при добавлении, удалении, редактировании PtTreeItem (аналог QTreeWidgetItem) требует item. Ну вот к примеру некоторые из методов из Photon:
1. Создание нового item-а (здесь wgt_tree - PtTree; str - char*; attr - PtTreeAttribute_t - атрибуты для  PtTree;):
Код:
PtTreeItem_t *new_item;
new_item = PtTreeCreateItem(wgt_tree, str,  attr);
2. Добавить item после(здесь wgt_tree - PtTree; item - тот что добавляем; brother - тот item после которого добавляем;):
Код:
PtTreeAddAfter(wgt_tree, item, brother); 
3. Добавить первый item(здесь wgt_tree - PtTree; item - тот что добавляем; brother - в даном случае будет родительским;):
Код:
PtTreeAddFirst(wgt_tree, item, brother);
4. Удаление item-a(здесь wgt_tree - PtTree; item - тот что который  хотим удалить;):
Код:
PtTreeRemoveItem(wgt_tree, item);
3. Изменить item (здесь wgt_tree - PtTree; str - char*; item - тот который хотим изменить; attr - PtTreeAttribute_t - атрибуты для attr):
Код:
 PtTreeChangeItem(wgt_tree , item, str,  attr);
Вот и думаю как подобные методы реализовать в Qt, так как я уже говорил, находил только те, которые требуют задавать item и его индекс.


Название: Re: Как в QTreeWidget редактировать конкретный item, не зная его индекс?
Отправлено: Zerkin от Апрель 08, 2015, 16:42
gil9red вам, в принципе, описал как всё это реализовать. Смотрите parent и topLevelItem.


Название: Re: Как в QTreeWidget редактировать конкретный item, не зная его индекс?
Отправлено: billy4685 от Апрель 08, 2015, 16:44
gil9red вам, в принципе, описал как всё это реализовать. Смотрите parent и topLevelItem.
gil9red, огромное спасибо) просто писал последнее сообщение) и увидел Ваше, уже после того как отправил. Буду реализовывать.