QTreeWidget - sprawdzenie, które elementy są zaznaczone

QTreeWidget - sprawdzenie, które elementy są zaznaczone
M1
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • 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:prawie 22 lata
  • Ostatnio:około 2 miesiące
  • 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:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:165
0

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

M1
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • 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);
edytowany 1x, ostatnio: maniek1310
MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:około godziny
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.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
B3
  • Rejestracja:ponad 11 lat
  • Ostatnio:9 miesięcy
  • Postów:79
0

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

M1
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • 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:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:165
0

@Odświeżam

MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:około godziny
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.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
M1
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • Postów:165
0

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

M1
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • 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
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:około godziny
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.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
M1
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • 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
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:około godziny
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.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
M1
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • 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:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • 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ść.

edytowany 2x, ostatnio: maniek1310
MarekR22
raczej chodziło o to, żebyś TY do tego doszedł, ale skoro ci nie zależy na ocenie tego co zrobiłeś to twoja sprawa.
M1
jak chcesz to możesz ocenić :D zaraz pojawi się kod w poście
M1
  • Rejestracja:prawie 11 lat
  • Ostatnio:prawie 9 lat
  • 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.

edytowany 3x, ostatnio: maniek1310
Zobacz pozostałe 2 komentarze
M1
Wiem, że może być bez new, ale tak też działa.
MarekR22
Za takie gadanie "ale działa" w informatyce wiesza się na najbliżej gałęzi. Wyobraź sobie sytuację, że program chodzi bardzo długo i wywołane jest to 1000 razy. Albo gdyby to nie był kod związany z działaniem użytkownika i w ciągu minuty wywoływany byłby 1000 razy. Będzie działać ale po 5000 razie wszystko się popsuje.
M1
@MarekR22 a z tym wyciekiem to rozchodzi ci się o to, że zapomniałem na końcu dodać "delete pParent;" ??
MarekR22
Zdecydowanie NIE! Powinno być 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.
M1
Czyli tak, też jest źle ?? "QTreeWidgetItem *pParent;"
MarekR22
Moderator C/C++
  • Rejestracja:ponad 17 lat
  • Ostatnio:około godziny
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.


Jeśli chcesz pomocy, NIE pisz na priva, ale zadaj dobre pytanie na forum.
edytowany 1x, ostatnio: MarekR22
Lucas Darkstorm
Lucas Darkstorm
W sumie jeśli chodzi o same drzewa (w sensie struktury danych) czy też np. rejestr systemu w Windowsie, to tylko za pomocą rekurencji można się po nich poruszać. Więc to rozwiązanie jest jak najbardziej oczywiste.

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.