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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Дерево нужно  (Прочитано 5608 раз)
White Owl
Гость
« : Ноябрь 18, 2010, 23:33 »

Нужно дерево основаное на примитивных типах. Не ГУИ объект, а тип данных.

В принципе, QObject уже умеет иметь детей и может быть использован как абстрактная нода, но всяческие QString и QVariant не являются потомками от QObject. Соответсвенно чтобы сделать дерево на основе строк приходится делать свой класс:
Код:
class StringObject: public QObject, public QString {
Q_OBJECT
public:
StringObject();
StringObject(const QString& value): QString(value) {}
};

Или я не туда смотрю и все намного проще?
Записан
asvil
Гость
« Ответ #1 : Ноябрь 19, 2010, 00:38 »

qthelp://com.trolltech.qt.460/qdoc/qstandarditemmodel.html
Записан
White Owl
Гость
« Ответ #2 : Ноябрь 19, 2010, 01:41 »

qthelp://com.trolltech.qt.460/qdoc/qstandarditemmodel.html
Повторяю для тех кто не умеет читать: НЕ ГУИ! Просто тип данных.

Вот QList<> в стандартной библиотеке есть, а QTree<> или QNode<> нету. Спрашивается, почему? и что вместо них?
Записан
Barmaglodd
Гость
« Ответ #3 : Ноябрь 19, 2010, 07:57 »

А там и не ГУЙ Подмигивающий Ничего похожего на дерево в Qt нет, если не нравится делай сам.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #4 : Ноябрь 19, 2010, 10:21 »

White Owl, штатного дерева в Qt нет.
Но готовый код элемента дерева есть в примере Editable Tree Model
Записан

Юра.
SimpleSunny
Гость
« Ответ #5 : Ноябрь 19, 2010, 10:33 »

Не только в Qt, в с++ тоже нет своего штатного дерева.

Посмотрите эту реализацию, когда ее хотели в boost включить
http://tree.phi-sci.com/

QMap и QSet также являются деревьями и во многих случаях можно использовать их.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Ноябрь 19, 2010, 12:14 »

Вот QList<> в стандартной библиотеке есть, а QTree<> или QNode<> нету. Спрашивается, почему? и что вместо них?
Потому что полагается что программист умеет создавать свои структуры данных (а не только пользовать чужие)
Записан
kirill
Гость
« Ответ #7 : Ноябрь 19, 2010, 15:34 »

QVariantList может делать детей в т.ч. и из QVariantList

QVariantList tree;
QVariantList node1;
QString leaf1;
QString leaf2;

QVariantList node2;

node1.append(leaf1);
node1.append(leaf2);
tree.append(node1);
tree.append(node2);

foreach (QVariant v, tree)
{
   if (v.canConvert(QVariant::List))
   {
         QVariantList ls = v.toList();
         //рекурсия
   }
}
Записан
White Owl
Гость
« Ответ #8 : Ноябрь 19, 2010, 21:13 »

Вот QList<> в стандартной библиотеке есть, а QTree<> или QNode<> нету. Спрашивается, почему? и что вместо них?
Потому что полагается что программист умеет создавать свои структуры данных (а не только пользовать чужие)
Во! Самое классное объяснение! Тогда, пусть "гуру общения" объяснит мне почему существует QList<>? Или по твоему мнению работать со коллекцией намного сложнее чем с деревьями и каждый программист обязан уметь делать свое дерево, но не обязан уметь делать коллекции? Улыбающийся

Я понимаю что многие-многие стандартные структуры используют деревья в качестве хранилища внутренних данных, и понимаю что можно сделать дерево на основе любого из коллекционных шаблонов (уже упоминались QList, QMap, QSet).
Но я не понимаю, почему не включили деревья в стандартный набор шаблонов?
Запросто ж можно сделать шаблон типа "template Node<T, child_count>" А на его основе уже делать шаблоны всяческих деревьев. И универсальных многодетных, и бинарных как частный случай универсальных, и всяческие AVL-, RedBlack- как частный случай бинарных...


Цитата: SimpleSunny
Посмотрите эту реализацию, когда ее хотели в boost включить
так ее потому и не включили что она не умеет делать специфические деревья с ограниченным количеством детей. А значит не универсальна. А если микро-библиотечка не универсальна - она не нужна в большой библиотеке.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #9 : Ноябрь 20, 2010, 02:24 »

дерево мене однородно, чем список.
А список, словарь, вектор - контейнеры и под них написаны и алгоритмы и итераторы. А вот для дерева их сделать уже сложнее.


Один вариант готового дерева я тебе подсказал, второй вариант - Kirill.
Записан

Юра.
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #10 : Ноябрь 20, 2010, 14:33 »

Во! Самое классное объяснение! Тогда, пусть "гуру общения" объяснит мне почему существует QList<>? Или по твоему мнению ..
Но я не понимаю, почему не включили деревья в стандартный набор шаблонов?
Др. дело если дерево заточено для поиска - ну такие и включены (std::set, QSet). А "просто дерево" не имеет той общности. Сделать его на template никто не запрещает но особых выгод не видно. Вот просто пример
Код
C++ (Qt)
struct CNode {
CNode * LookupRecursive( TLookupProc theLookup );
 ..          // др.методы
 
// данные
int mID;
QString mName;
CNode * mParent;  // возможно указатель на parent
....             // др.данные
QList <CNode *> mChildren;  // контейнер указателей на детей
};
 
Чего не хватает? Зачем нужно упорно изыскивать шаблоны, заучивать классы и.т.п. вместо того чтобы просто написать свое за 10 минут? Чем оно хуже и почему надо обязательно что-то "знать" (и, как часто бывает, с радостью топтать тех кто "не знает!")? Программирование не было и не будет соревнованием "кто больше запомнит". Слишком уж хорошее знание STL часто есть "Блеск и нищета куртизанок"  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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