Witam mam problem ze sprawdzeniem, które elementy QTreeWidget są zaznaczone. QTreeWidget utworzyłem za pomocą creatora (elementy tak samo).
- Rejestracja:prawie 11 lat
- Ostatnio:prawie 9 lat
- Postów:165
A dało by radę istniejącym elementom zmienić dane ?? Np. nazwę ??
- Rejestracja:prawie 11 lat
- Ostatnio:prawie 9 lat
- Postów:165
Na próbę zrobiłem kod, którym ustawiam zaznaczenie w danym elemencie, ale dopiero po kliknięciu. I nie wiem jak to przerobić aby zaznaczał wszystkie elementy, a nie tylko te wybrane.
QList<QTreeWidgetItem *> items = ui->treeNinite->selectedItems();
foreach(QTreeWidgetItem *item, items){
if(item->checkState(0) != Qt::Checked)
item->setCheckState(0 , Qt::Checked);

- Rejestracja:ponad 17 lat
- Ostatnio:około godziny
Zaznaczenie jest reprezentowane przez model, dostępny za pomocą metody selectionModel.
Najlepiej poczytaj jak działa QItemSelectionModel, za jego pomocą możesz robić dowolne cuda z zaznaczeniem.
- Rejestracja:prawie 11 lat
- Ostatnio:prawie 9 lat
- Postów:165
No ale mi się nie rozchodzi o jeden element a o wszystkie. Coś takiego jak mam tutaj z QListView
for(int i = 0; i < ile_ninite; i++)
{
QListWidgetItem *select_prog = ui->ninite->item(i);
select_prog->setCheckState(Qt::Unchecked);
}
- Rejestracja:prawie 11 lat
- Ostatnio:prawie 9 lat
- Postów:165
@Odświeżam

- Rejestracja:ponad 17 lat
- Ostatnio:około godziny
Zamiast odświeżać napisz dokładnie o co ci chodzi. Mam wrażenie, że mylisz "selected" z "checkable".
Na dodatek jak mas drzewo i chcesz prześledzić całą strukturę tego drzewa, to jest chyba oczywiste, jak to zrobić. Najprościej za pomocą rekurencji.
- Rejestracja:prawie 11 lat
- Ostatnio:prawie 9 lat
- Postów:165
Zrobiłem to, ale tylko zaznacza te elementy, które są na samej górze drzewa. Pozostałem nie oznacza "Qt::Checked"
for(int i = 0; i < ui->treeNinite->topLevelItemCount(); i++)
{
QTreeWidgetItem *item = ui->treeNinite->topLevelItem(i);
item->setCheckState(0, Qt::Checked);
}
- Rejestracja:prawie 11 lat
- Ostatnio:prawie 9 lat
- Postów:165
Coś pamiętam ale o tablicy rekurencji, że wystarczyło dodawać i można było wypisać dany element.
Ps. To może podpowiedź po jakiej rekurencji mam się poruszać (jakiego elementu) ??

- Rejestracja:ponad 17 lat
- Ostatnio:około godziny
Bierzesz się za zaawansowany framework (Qt), a nawet nie wiesz co to rekurencja? Ba nie chciało ci się nawet pogoolgać o co chodzi!
To są podstawy programowania w dowolnym języku!
Rekurencja to sytuacja, kiedy funkcja wywołuje sama siebie pod określonym warunkiem.
Poszukaj, poczytaj, naucz się czegoś. Rozwiązanie wkleję tylko wtedy, gdy wykażesz się inwencją, a z jakiegoś dziwnego powodu sam nie wpadniesz na rozwiązanie.
- Rejestracja:prawie 11 lat
- Ostatnio:prawie 9 lat
- Postów:165
Wziąłem się za framework, tylko dlatego, że lepiej można programować aplikacje graficzne. Właśnie czytam pracę dyplomową inżynierską nt. "Wykorzystanie mechanizmu delegata do emulacji struktury i zachowania widżetów w architekturze Model/Widok biblioteki Qt4"
- Rejestracja:prawie 11 lat
- Ostatnio:prawie 9 lat
- Postów:165
Problem rozwiązany. Temat można zamknąć.
Sprawdzam kolejno "topLevelItem" a następnie pętlą for sprawdzam wszystkie "child".
Ps. Bym wkleił kod ale jak napisał @MarekR22 najlepiej jest samemu do tego dojść.

- Rejestracja:prawie 11 lat
- Ostatnio:prawie 9 lat
- Postów:165
QTreeWidgetItem *pParent = new QTreeWidgetItem();
for(int i = 0; i < ui->treeNinite->topLevelItemCount(); i++)
{
pParent = ui->treeNinite->topLevelItem(i);
int nChildCount = pParent->childCount();
for(int j = 0; j < nChildCount; j++)
{
if(pParent->child(j)->checkState(0) == Qt::Unchecked)
pParent->child(j)->setCheckState(0, Qt::Checked);
}
}
delete pParent;
Ps. Pewnie zaraz będzie, że dlaczego nie sprawdzam kolejnych poziomów, bo mógłbym, ale do tego programu nie jest mi to potrzebne.


QTreeWidgetItem *pParent = null;
, albo definicja zmiennej wewnątrz pętli. Wytłumacz sobie po cholerę tworzysz nowy obiekt, skoro masz zamiar manipulować tylko na starych obiektach.

- Rejestracja:ponad 17 lat
- Ostatnio:około godziny
Ja bym zrobił tak:
void setCheckedStateForAllItems(QAbstractItemModel *model, bool checked, const QModelIndex &index = QModelIndex())
{
if (index.isValid() && index.flags().testFlag(Qt::ItemIsUserCheckable)) {
model->setData(index, checked?Qt::Checked:Qt::Unchecked, Qt::CheckStateRole);
}
for (int i=0; i<model->rowCount(index); ++i) {
setCheckedStateForAllItems(model, checked, model->index(i, 0, index));
}
}
// przykład uzycia
QAbstractItemModel *model = ui->treeWidget->model();
setCheckedStateForAllItems(model, checked);
Zalety:
- zadziała dla każdego modelu, nie tylko opartego o
QTreeWidgetItem
(no prawie, bo dla tabel trzeba by było poprawić) - zadziała dla całości drzewa bez względu na jego głębokość
- jest równie proste
Może przy okazji zrozumiesz na czym polega rekurencja.
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.