Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: melana от Март 30, 2009, 18:20



Название: Помогите пожалуста с QTree.
Отправлено: melana от Март 30, 2009, 18:20
у меня с файла читается ID, ID_parent, name и свойства элемента. не могу построить дерево. не знаю как определять предка. Создаю тока корни. 


Название: Re: Помогите пожалуста с QTree.
Отправлено: spirit от Март 30, 2009, 18:27
создаете рута (QTreeWidgetItem), а затем при помощи QTreeWidgetItem::addChildren добавляте потомков.
или сложность в чем-то другом?  ???


Название: Re: Помогите пожалуста с QTree.
Отправлено: melana от Март 30, 2009, 18:30
у меня файле только int. как по нему определить предка? искать по всему дереву?


Название: Re: Помогите пожалуста с QTree.
Отправлено: spirit от Март 30, 2009, 18:36
че-то вообще вопрос не догоняю, что нужно сделать: построить GUI дерево?


Название: Re: Помогите пожалуста с QTree.
Отправлено: melana от Март 30, 2009, 18:43
Построить дерево читая данные из файла :(ID    ID_parent    name)
1   0   имя1
2   1   имя2
3   1    имя3
4    2   имя4 и т.д. в дереве тока имя элемента отображать


Название: Re: Помогите пожалуста с QTree.
Отправлено: spirit от Март 30, 2009, 18:48
читать файл построчно.
берем первый парент и получаем все его чилды.
строим GUI айетеимы.


Название: Re: Помогите пожалуста с QTree.
Отправлено: melana от Март 30, 2009, 18:51
я читаю с файла и все в структуру пишу, но как Item создать не догонаю. тока с parent = 0 могу создать


Название: Re: Помогите пожалуста с QTree.
Отправлено: spirit от Март 30, 2009, 18:59
так должно работать
Код
C++ (Qt)
class MyItem
{
public:
   MyItem(int id, const QString &name, MyItem *parent = 0);
....
   int id() const;
   QString name() const;
 
   QList<MyItem *> children() const;
...
};
...
void MyWidget::buildTree()
{
 QList<MyItem *> roots = items();//метод возвращающий список ваших айтемов
 for (int i = 0; i < rootsCount; ++i) {
    const MyItem *myRoot = roots.at(i);  
    QTreeWidgetItem *root = new QTreeWidgetItem();
    root->setText(myRoot->name());
    QList<MyItem *> children = myRoot->children();
    for (int c = 0; c < children.size(); ++c) {
       const MyItem *myChild = children.at(c);  
       QTreeWidgetItem *child = new QTreeWidgetItem(root);
       child->setText(myChild->name());
    }
    tree->addTopLevelItem(root);
 }
}
 


Название: Re: Помогите пожалуста с QTree.
Отправлено: melana от Март 30, 2009, 19:09
спасибо.попробую. но че то я не до конца поняла for (int c = 0; c < children.size(); ++c)  для чего это?


Название: Re: Помогите пожалуста с QTree.
Отправлено: spirit от Март 30, 2009, 19:10
это дети рута.


Название: Re: Помогите пожалуста с QTree.
Отправлено: Rcus от Март 30, 2009, 19:15
А еще возможно подойдет такой способ:
Код
C++ (Qt)
struct TreeData
{
   int id;
   int parentId;
   const char * const name;
};
 
const TreeData treeData[] = {{1,0,"root"}, {2,1,"first child"}, {3,1,"second child"}, {4,2,"subchild"}};
 
MainWindow::MainWindow(QWidget *parent)
   : QMainWindow(parent)
{
   QTreeWidget *tree = new QTreeWidget(this);
   setCentralWidget(tree);
   int itemCount = sizeof(treeData)/sizeof(TreeData);
   typedef QHash<int, QPair<int, QTreeWidgetItem *> > ItemHash;
   ItemHash itemHash;
   for (int i = 0; i < itemCount; ++i) {
           QTreeWidgetItem *item = new QTreeWidgetItem(QStringList(QString(treeData[i].name)));
       itemHash[treeData[i].id] = qMakePair(treeData[i].parentId,item);
   }
   for (ItemHash::iterator it = itemHash.begin(); it != itemHash.end(); ++it) {
       int parent = it.value().first;
       QTreeWidgetItem *item = it.value().second;
       if (itemHash.contains(parent)) {
           itemHash[parent].second->addChild(item);
       } else {
           tree->addTopLevelItem(item);
       }
   }
}
 


Название: Re: Помогите пожалуста с QTree.
Отправлено: melana от Март 30, 2009, 19:48
Спасибки БОЛЬШОЕ попробую, теперь поняла как с QTree работать :D  :D  :D