Witam mam problem ze sprawdzeniem, które elementy QTreeWidget są zaznaczone. QTreeWidget utworzyłem za pomocą creatora (elementy tak samo).
QTreeWidget - sprawdzenie, które elementy są zaznaczone
- Rejestracja: dni
- Ostatnio: dni
- Postów: 165
- Rejestracja: dni
- Ostatnio: dni
- Postów: 192
Jak zwykle w takich sytuacjach należy spojżeć do dokumentacji Qt. W opisie klasy QTreeWidget mamy funkcję :
QList<QTreeWidgetItem *> selectedItems () const
- Rejestracja: dni
- Ostatnio: dni
- Postów: 165
A dało by radę istniejącym elementom zmienić dane ?? Np. nazwę ??
- Rejestracja: dni
- Ostatnio: dni
- 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: dni
- Ostatnio: dni
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: dni
- Ostatnio: dni
- Postów: 79
Możesz też użyć sygnału itemClicked, aby wyłapać element, który został zaznaczony.
- Rejestracja: dni
- Ostatnio: dni
- 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: dni
- Ostatnio: dni
- Postów: 165
@Odświeżam
- Rejestracja: dni
- Ostatnio: dni
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: dni
- Ostatnio: dni
- 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: dni
- Ostatnio: dni
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.
- Rejestracja: dni
- Ostatnio: dni
- 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: dni
- Ostatnio: dni
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: dni
- Ostatnio: dni
- 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: dni
- Ostatnio: dni
- 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.
- Rejestracja: dni
- Ostatnio: dni
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.