Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] Проблема с collapse в QTreeView


Автор: Brodyaga 18.3.2011, 16:58
Всем привет!
Такая проблема, хочу из кода свернуть соответствующий узел дерева, использую для этого
void QTreeView::collapse ( const QModelIndex & index )

Узел не сворачивается, хотя index точно верный, так как проверяю получением из него объекта (QModelIndex::internalPointer)

Также пробовал функцию setExpanded ( const QModelIndex & index, bool expanded ), на работает.

Причём когда использую void QTreeView::collapseAll () всё работает отлично, но сворачиваются ВСЕ узлы, а мне нужны только определённые.

Кто-нибудь сталкивался с подобной проблемой? Как быть?

Автор: borisbn 18.3.2011, 17:08
Цитата(Brodyaga @  18.3.2011,  16:58 Найти цитируемый пост)
Узел не сворачивается, хотя index точно верный, так как проверяю получением из него объекта (QModelIndex::internalPointer)

Цитата

void * QModelIndex::internalPointer () const
Returns a void * pointer used by the model to associate the index with the internal data structure.

о каком объекте ты говоришь ?

Попробуй след. образом: подцепись на сигнал
void QTreeView::expanded ( const QModelIndex & index )   [signal]
и внутри этого метода вызывай
void QTreeView::collapse ( const QModelIndex & index )
с тем же индексом. "Раскрой" какой-нибудь узел. Он, по идее, должен свернуться обратно.
Если всё так, то ты неверно задаешь index в collapse

Автор: Brodyaga 18.3.2011, 17:11
Цитата

о каком объекте ты говоришь ?


Я делаю дерево на основе своей модели, в internalPointer хранятся мои объекты, при проверке я получаю свой объект и вижу что он тот которому соответствует узел, так что index верный.

Автор: _GRIN_ 18.3.2011, 17:15
QTreeView::collapse() и QTreeView::expand() работают нормально (специально мини-приложение с дизайнером набросал и проверил)
Код

void MainWindow::on_pushButton_clicked()
{
    //collapse
    QModelIndex index = ui->treeWidget->currentIndex();
    if(index.isValid()) {
        QTreeView*view = qobject_cast<QTreeView*>(ui->treeWidget); //что бы продемонстрировать, что используется именно интерфейс QTreeView()
        Q_ASSERT(view);
        view->collapse(index);
    }
}

void MainWindow::on_pushButton_2_clicked()
{
    //expand
    QModelIndex index = ui->treeWidget->currentIndex();
    if(index.isValid()) {
        QTreeView*view = qobject_cast<QTreeView*>(ui->treeWidget); //что бы продемонстрировать, что используется именно интерфейс QTreeView()
        Q_ASSERT(view);
        view->expand(index);
    }
}


Думаю вам стоит копать в сторону неправильного индекса (у меня были подобные проблемы из-за сортировки - но правда не в дереве а в таблице).
Тестовое приложение (на котором проверял) QTreeWidget и две кнопки - в дерево делаешь айтемы (3x3x3) и проверяешь - обработчики в коде выше).

Автор: Brodyaga 18.3.2011, 17:18
Цитата

Попробуй след. образом: подцепись на сигнал
void QTreeView::expanded ( const QModelIndex & index )   [signal]
и внутри этого метода вызывай
void QTreeView::collapse ( const QModelIndex & index )
с тем же индексом. "Раскрой" какой-нибудь узел. Он, по идее, должен свернуться обратно.
Если всё так, то ты неверно задаешь index в collapse


Так работает :(


Цитата

Думаю вам стоит копать в сторону неправильного индекса (у меня были подобные проблемы из-за сортировки - но правда не в дереве а в таблице).


У меня как раз прокси модель поверх обычной положена... Сейчас ещё покопаюсь..

Автор: Brodyaga 18.3.2011, 17:38
Заработало, оказывается нужно было индекс прокси модели использовать а не приобразовывать его в индекс обычной модели! Всем спасибо, тема закрыта.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)