Witam mam problem ze sprawdzeniem, które elementy QTreeWidget są zaznaczone. QTreeWidget utworzyłem za pomocą creatora (elementy tak samo).
Jak zwykle w takich sytuacjach należy spojżeć do dokumentacji Qt. W opisie klasy QTreeWidget mamy funkcję :
QList<QTreeWidgetItem *> selectedItems () const
A dało by radę istniejącym elementom zmienić dane ?? Np. nazwę ??
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);
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.
Możesz też użyć sygnału itemClicked, aby wyłapać element, który został zaznaczony.
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);
}
@Odświeżam
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.
@MarekR22 tak rozchodzi mi się o "checkable".
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);
}
Wiesz co to rekurencja? I jak za jej pomocą poruszać się po drzewie? Rusz głową to naprawdę proste.
Mam to napisane i mógłbym ci to wkleić, ale lepiej dla ciebie będzie jak z ciebie to wyduszę :P.
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) ??
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.
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"
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ść.
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.
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.