QTreeWidget - sprawdzenie, które elementy są zaznaczone

QTreeWidget - sprawdzenie, które elementy są zaznaczone
M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 165
0

Witam mam problem ze sprawdzeniem, które elementy QTreeWidget są zaznaczone. QTreeWidget utworzyłem za pomocą creatora (elementy tak samo).

ZI
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 192
0

Jak zwykle w takich sytuacjach należy spojżeć do dokumentacji Qt. W opisie klasy QTreeWidget mamy funkcję :

Kopiuj
QList<QTreeWidgetItem *>	selectedItems () const
M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 165
0

A dało by radę istniejącym elementom zmienić dane ?? Np. nazwę ??

M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 165
0

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.

Kopiuj
QList<QTreeWidgetItem *> items = ui->treeNinite->selectedItems();

    foreach(QTreeWidgetItem *item, items){
        if(item->checkState(0) != Qt::Checked)
            item->setCheckState(0 , Qt::Checked);
MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
0

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.

B3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 79
0

Możesz też użyć sygnału itemClicked, aby wyłapać element, który został zaznaczony.

M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 165
0

No ale mi się nie rozchodzi o jeden element a o wszystkie. Coś takiego jak mam tutaj z QListView

Kopiuj
 for(int i = 0; i < ile_ninite; i++)
        {
            QListWidgetItem *select_prog = ui->ninite->item(i);
            select_prog->setCheckState(Qt::Unchecked);
        } 
M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 165
0

@Odświeżam

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
0

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.

M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 165
0

@MarekR22 tak rozchodzi mi się o "checkable".

M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 165
0

Zrobiłem to, ale tylko zaznacza te elementy, które są na samej górze drzewa. Pozostałem nie oznacza "Qt::Checked"

Kopiuj
for(int i = 0; i < ui->treeNinite->topLevelItemCount(); i++)
    {
        QTreeWidgetItem *item = ui->treeNinite->topLevelItem(i);

        item->setCheckState(0, Qt::Checked);
    }
MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
0

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.

M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 165
0

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) ??

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
0

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.

M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 165
0

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"

M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 165
0

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ść.

M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 165
0
Kopiuj
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.

MarekR22
  • Rejestracja: dni
  • Ostatnio: dni
1

Ja bym zrobił tak:

Kopiuj
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.