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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QTreeWidget  (Прочитано 5375 раз)
Az
Гость
« : Май 03, 2010, 14:34 »

Добрый день.
Вопрос достаточно тривиальный, но я что-то подзапутался.

Есть QTreeWidget в котором 1 колонка, 3 айтема и по 3-4 чилдрена в каждом. Но основной момент (и проблема) в том, что у них у всех есть чекбоксы. Смысл всего этого в том, чтобы при выборе определенных чекбоксов и нажатия кнопки, в textEdit выводилось содержимое чилдренов. Чекбоксы самих айтемов не имеют значения.
На сколько я понял, нужно 2 этапа для обработки этого дела:
1. Циклом проверить все чилдрены на checked
2. Вывести значения чекнутых в textEdit.

Получилось что-то вроде этого:
Код
C++ (Qt)
QTreeWidgetItem* item;
int column = item->columnCount();
int n_childrens = item->childCount();
 
switch (item->checkState(0)) {
 
           case (Qt::Unchecked):
               break;
 
           case (Qt::PartiallyChecked):
               break;
 
           case (Qt::Checked):
               for (int i = 0; i < n_childrens; i++) {
 
                   QTreeWidgetItem    *subItem = item->child(i);
                   QString child = subItem->text(i);
                   ui->textEdit->insertPlainText(child);
               }
               break;
       }
}
 
Но все же есть тут ошибка, а вот какая никак не соображу.
Записан
garryHotDog
Гость
« Ответ #1 : Май 03, 2010, 14:37 »

покажи вывод компилятора(ошибку)
Записан
Az
Гость
« Ответ #2 : Май 03, 2010, 14:39 »

покажи вывод компилятора(ошибку)

Ошибка традиционная:
Код:
The program has unexpectedly finished.
Записан
crossly
Гость
« Ответ #3 : Май 03, 2010, 14:49 »

вот твоя ошибка
Код:
QTreeWidgetItem* item;
на что указывает item??
Записан
Az
Гость
« Ответ #4 : Май 03, 2010, 15:22 »

Да, получается, что ни на что....
Тогда глупый вопрос:
если использовать такую схему, то вылета нет, но ничего не происходит.
Код
C++ (Qt)
QTreeWidgetItem *item = new QTreeWidgetItem(ui->treeWidget);
 
Заранее извиняюсь, если бред спросил, не спал уже почти сутки, в голове такой бред творится  Непонимающий
« Последнее редактирование: Май 03, 2010, 15:37 от Az » Записан
crossly
Гость
« Ответ #5 : Май 03, 2010, 15:41 »

ну понятное дело... ты же новое дерево создаешь таким образом.... тебе нужно к примеру
Код:
QTreeWidgetItem *item = ui->treeWidget->invisibleRootItem()
т.е. так ты получишь корень твоего дерева... а дальше двигайся вниз и делай свое темное дело... Улыбающийся
Записан
Az
Гость
« Ответ #6 : Май 03, 2010, 15:55 »

Все-таки что-то в моей конструкции не то, ругатся не ругается, но и вывода нет. Придется походу таки городить отдельный класс  Грустный
Записан
crossly
Гость
« Ответ #7 : Май 03, 2010, 16:16 »

ну понятное дело не то.... ты же в switch проверяешь установлен у тебя флажок в rootItem.... он естественно там никогда не установлен... ибо его даже не видно... Улыбающийся
Записан
Az
Гость
« Ответ #8 : Май 03, 2010, 16:42 »

Можно было бы объявить:
Код
C++ (Qt)
QTreeWidgetItem *item = ui->treeWidget->invisibleRootItem()->child(i);
но одна проблема, его нельзя поместить цикл, потому что тогда n_childrens еще неизвестно до объявления item...
замкнутый круг однако...
« Последнее редактирование: Май 03, 2010, 17:20 от Az » Записан
crossly
Гость
« Ответ #9 : Май 04, 2010, 09:26 »

я не вижу никакой проблемы.... берем rootItem спускаемся вниз и проверяем то что нужно...
Записан
Az
Гость
« Ответ #10 : Май 11, 2010, 20:32 »

crossly, спасибо!

Результатом пары вечеров стало это:
Код
C++ (Qt)
QString child_text;
for(int i=0; i<ui->treeWidget->invisibleRootItem()->childCount(); ++i)
{
QTreeWidgetItem *item = ui->treeWidget->invisibleRootItem()->child(i);
 
 
if (item->checkState(0) == Qt::Checked)
{
        for (int j = 0; j < item->childCount(); ++j)
        {
                   QTreeWidgetItem    *subItem = item->child(j);
                   child_text += subItem->text(0) + "\n";    
        }
 
}
}
ui->textEdit->insertPlainText(child_text);
И все-таки не так оно работает, как хотелось бы. Сейчас получается так, что если группа выбрана, то он выводит все, что есть в подгруппах. То есть, даже если в подгруппах ничего не чекнуто, он все-равно выводит все...
Записан
Az
Гость
« Ответ #11 : Май 11, 2010, 22:37 »

Все, вроде доковырял. Всем спасибо!

Код
C++ (Qt)
QString child_text;
for(int i=0; i < ui->treeWidget->invisibleRootItem()->childCount(); ++i)
{
QTreeWidgetItem *item = ui->treeWidget->invisibleRootItem()->child(i);
 
 
if (item->checkState(0) == Qt::Checked||Qt::PartiallyChecked)
{
        for (int j = 0; j < item->childCount(); ++j)
        {
                   QTreeWidgetItem    *subItem = item->child(j);
                   if (subItem->checkState(0) == Qt::Checked) {
                       child_text += subItem->text(0) + "\n"; }
        }
 
}
}
ui->textEdit->insertPlainText(child_text);
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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