Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: Az от Май 03, 2010, 14:34



Название: QTreeWidget
Отправлено: 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;
       }
}
 
Но все же есть тут ошибка, а вот какая никак не соображу.


Название: Re: QTreeWidget
Отправлено: garryHotDog от Май 03, 2010, 14:37
покажи вывод компилятора(ошибку)


Название: Re: QTreeWidget
Отправлено: Az от Май 03, 2010, 14:39
покажи вывод компилятора(ошибку)

Ошибка традиционная:
Код:
The program has unexpectedly finished.


Название: Re: QTreeWidget
Отправлено: crossly от Май 03, 2010, 14:49
вот твоя ошибка
Код:
QTreeWidgetItem* item;
на что указывает item??


Название: Re: QTreeWidget
Отправлено: Az от Май 03, 2010, 15:22
Да, получается, что ни на что....
Тогда глупый вопрос:
если использовать такую схему, то вылета нет, но ничего не происходит.
Код
C++ (Qt)
QTreeWidgetItem *item = new QTreeWidgetItem(ui->treeWidget);
 
Заранее извиняюсь, если бред спросил, не спал уже почти сутки, в голове такой бред творится  ???


Название: Re: QTreeWidget
Отправлено: crossly от Май 03, 2010, 15:41
ну понятное дело... ты же новое дерево создаешь таким образом.... тебе нужно к примеру
Код:
QTreeWidgetItem *item = ui->treeWidget->invisibleRootItem()
т.е. так ты получишь корень твоего дерева... а дальше двигайся вниз и делай свое темное дело... :)


Название: Re: QTreeWidget
Отправлено: Az от Май 03, 2010, 15:55
Все-таки что-то в моей конструкции не то, ругатся не ругается, но и вывода нет. Придется походу таки городить отдельный класс  :(


Название: Re: QTreeWidget
Отправлено: crossly от Май 03, 2010, 16:16
ну понятное дело не то.... ты же в switch проверяешь установлен у тебя флажок в rootItem.... он естественно там никогда не установлен... ибо его даже не видно... :)


Название: Re: QTreeWidget
Отправлено: Az от Май 03, 2010, 16:42
Можно было бы объявить:
Код
C++ (Qt)
QTreeWidgetItem *item = ui->treeWidget->invisibleRootItem()->child(i);
но одна проблема, его нельзя поместить цикл, потому что тогда n_childrens еще неизвестно до объявления item...
замкнутый круг однако...


Название: Re: QTreeWidget
Отправлено: crossly от Май 04, 2010, 09:26
я не вижу никакой проблемы.... берем rootItem спускаемся вниз и проверяем то что нужно...


Название: Re: QTreeWidget
Отправлено: Az от Май 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);
И все-таки не так оно работает, как хотелось бы. Сейчас получается так, что если группа выбрана, то он выводит все, что есть в подгруппах. То есть, даже если в подгруппах ничего не чекнуто, он все-равно выводит все...


Название: Re: QTreeWidget
Отправлено: Az от Май 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);