QTreeWidget - sprawdzenie, które elementy są zaznaczone

0

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

0

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

QList<QTreeWidgetItem *>	selectedItems () const
0

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

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.

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

    foreach(QTreeWidgetItem *item, items){
        if(item->checkState(0) != Qt::Checked)
            item->setCheckState(0 , Qt::Checked);
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.

0

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

0

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);
        } 
0

@Odświeżam

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.

0

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

0

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);
    }
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.

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

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.

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"

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

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

1

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.

1 użytkowników online, w tym zalogowanych: 0, gości: 1