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


Автор: xAndeRx 3.3.2015, 23:43
Доброй ночи всем. 
У меня такая задача, построить дерево, из последовательности чисел. Закономерность разделения на узлах не важна, это на усмотрение. Меня интересует сейчас другое.
Я новичок в плане QT, использую QT Creator. Нашел виджет TreeWidget, подходящий под мою задачу, но не могу разобраться как с ним справиться. То есть, как в него занести определенную последовательность чисел и разбить на узлы дерева. 

Подкиньте кто простенький пример, как занести в этот виджет данные и уже от этого я смогу отталкиваться, чтобы разобраться в этом. 
Буду очень благодарен.  smile 

Автор: math64 4.3.2015, 09:19
Примеры есть в самом Qt. Поищите QTreeWidget в каталоге примеров.
Еще можно в редакторе форм заполнить QTreeWidget своими данными, откомпилировать и посмотреть на код сгенрированный в ui_mainwindow.h.

Автор: xAndeRx 4.3.2015, 19:02
Цитата(math64 @ 4.3.2015,  09:19)
Примеры есть в самом Qt. Поищите QTreeWidget в каталоге примеров.
Еще можно в редакторе форм заполнить QTreeWidget своими данными, откомпилировать и посмотреть на код сгенрированный в ui_mainwindow.h.

Создал через редактор, как вы посоветовали, понял что и к чему написано в коде ниже. Но тут же возник вопрос, как мне вручную прописывать это?(а не через редактор). То есть, чтобы была программа которая, после введения чисел раскидывала бы их в эти колонки? 
Мне же это нужно писать в MainWindow.cpp.
Код

<widget class="QWidget" name="page_2">
     <widget class="QTreeWidget" name="treeWidget">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>811</width>
        <height>521</height>
       </rect>
      </property>
      <column>
       <property name="text">
        <string>Первый</string>
       </property>
      </column>
      <item>
       <property name="text">
        <string>Первый.1</string>
       </property>
       <item>
        <property name="text">
         <string>Первый 1.1</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>Первый 1.2</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>Первый 1.3</string>
        </property>
       </item>
      </item>
      <item>
       <property name="text">
        <string>Первый.2</string>
       </property>
       <item>
        <property name="text">
         <string>Первый 2.1</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>Первый 2.2</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>Первый 2.3</string>
        </property>
       </item>
      </item>
      <item>
       <property name="text">
        <string>Первый.3</string>
       </property>
       <item>
        <property name="text">
         <string>Первый 3.1</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>Первый 3.2</string>
        </property>
       </item>
       <item>
        <property name="text">
         <string>Первый 3.3</string>
        </property>
       </item>
      </item>
     </widget>
    </widget>
   </widget>
  </widget>

Автор: math64 5.3.2015, 08:37
При компиляции по mainform.ui, приведённому вами, генерируется ui_mainwindow.h .
Встаньте на строчку #include "ui_mainwindow.h" в mainform.cpp и нажмите F2.
Код, подобный сгенерированному, вам нужно создавать вручную.
setupUi создает виджеты, retranslateUi создает строки с учетом возможности переключения языка, но не учитывает, что содержмиое treeWidget пожет поменяться при работе программы.
Вам это деление делать необязательно, все можно сделать в конструкторе MainWindow.
Русские буквы в генерированном коде будут заменены на такие - "\320\236\321\202\320\272\321\200\321\213\321\202\321\214" ("Открыть"), поэтому для исследования лучше вводить  текст на английском.

Автор: Amp 5.3.2015, 11:54
Можно же проще, в дизайнере выбрать "Форма" -> "Показать код"

Автор: xAndeRx 5.3.2015, 23:43
Немного продвинулся и уже создал некое дерево из элементов. Выстроенных по правилу: 
1)Вершина - минимальный элемент (и сортировка идет чем ниже дерево, тем больше значение элемента.
2)Потом деление на четные и нечетные
3)И все полученные цифры сгруппировать, если они одинаковые.(то есть, если есть три экземпляра числа "10" то 1-ое число сделать узлом и в его child остальные 2 засунуть.

Так вот с 3-им пунктом проблемка... Не пойму как при встрече одинаковых элементов(у меня массив отсортирован, то есть все одинаковые идут подряд), запихнуть последующие в child первого. 



Мой вариант: 
Код

void MainWindow::on_pushButton_5_clicked()
{
     const int ArrSize = 50;
     srand(time(NULL));
     int ArrayTwo[ArrSize];
     for (int i=0; i<ArrSize; i++)
     {
         ArrayTwo[i] = (rand() % 100)-50;
     }
     QString ArrayOne[ArrSize];

     ui->treeWidget->setColumnCount(1);

     ui->treeWidget->addTopLevelItem(One);

     //Сортировка
     int buffer = ArrayTwo[0];
     for (int i=0; i<ArrSize; i++)
     {
         for (int j=0; j<ArrSize; j++)
         {
             if (ArrayTwo[i]<ArrayTwo[j])
             {
                 buffer = ArrayTwo[i];
                 ArrayTwo[i]=ArrayTwo[j];
                 ArrayTwo[j]=buffer;
             }
         }
     }
     //Перевод массива int в массив QString
     for (int i=0; i<ArrSize; i++)
     {
         for (int j=0; j<ArrSize; j++)
         {
            ArrayOne[i] =QString::number(ArrayTwo[i]);
         }
     }
 
     //Занесение массива в дерево
     One->setText(0,ArrayOne[0]);
     for (int i=1; i<ArrSize; i++)
     {
         if (count1 != 2)
         {
             if (ArrayTwo[i] % 2 == 0)
             {
                 if (count == 0 )
                 {
                     Two->setText(0,ArrayOne[i]);
                     One->addChild(Two);
                     count=1;
                     count1++;
                 }
             }
             if (ArrayTwo[i] % 2 != 0)
             {
                 if (count == 1)
                 {
                     Three->setText(0,ArrayOne[i]);
                     One->addChild(Three);
                     count=2;
                     count1++;
                 }
             }
         }
         else if (count1 == 2)
         {
                 if (ArrayTwo[i] % 2 == 0)
                 {
                     if (ArrayTwo[i] == ArrayTwo[i-1])//ВОТ ТУТ ПРОБУЮ СДЕЛАТЬ ПРОВЕРКУ НА ОДИНАКОВЫЕ ЭЛЕМЕНТЫ,
 //но к какому Child'y тут нужно присваивать? Как я сделал, не работает.
                     {
                         QTreeWidgetItem *Fourth = new QTreeWidgetItem;
                         QTreeWidgetItem *Child = new QTreeWidgetItem;
                         Child->setText(0,ArrayOne[i]);
                         Fourth->addChild(Child);
                     }
                     else
                     {
                         QTreeWidgetItem *Fourth = new QTreeWidgetItem;
                         Fourth->setText(0,ArrayOne[i]);
                         Two->addChild(Fourth);
                     }
                 }

                 if (ArrayTwo[i] % 2 !=0)
                 {
                     QTreeWidgetItem *Fifth = new QTreeWidgetItem;
                     Fifth->setText(0,ArrayOne[i]);
                     Three->addChild(Fifth);
                 }
         }
    }


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