Russian Qt Forum
Сентябрь 30, 2024, 14:29 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [qt-4.2.0] QTreeView и программная навигация по строкам  (Прочитано 6162 раз)
izoomer
Гость
« : Апрель 25, 2007, 13:31 »

Подскажите, как сделать программную навигацию по строкам в QTreeView. У меня в программе нет клавиатуры, и упраление навигацией осуществляется внешними сигналами в программу ... вот и нужно сделать перемещение вверх вниз по строкам без клавиатуры и мыши.  Может можно как то эмулировать нажатие кнопок, или выполнять методы которые вызываются при нажатии кнопок.
Пробовал сделать свой класс от QTreeView с методами selectNextItem, selectPrevItem
Код:

JTreeView.h :

class JTreeView : public QTreeView
{
Q_OBJECT
public:
JTreeView(QWidget *parent = 0);
~JTreeView();

void selectNextItem();
void selectPrevItem();
...
...


JTreeView.cpp:

void JTreeView::selectNextItem (  ){
moveCursor ( QAbstractItemView::MoveDown, Qt::NoModifier );
}

void JTreeView::selectPrevItem (  ){
moveCursor ( QAbstractItemView::MoveUp, Qt::NoModifier );
}



но не работает. Подскажите как сделать.
Если через программную навигацию через setCurrentIndex , то тормозит очень нажатие, а через клаву работает, но мне клава не нужна.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #1 : Апрель 25, 2007, 13:55 »

для Qt3 я бы предложил два варианта (не думаю, что для 4 сильно будет отличаться):

1) эмулировать нажатия клавишь мктодом создания QKeyEvent-а с нужным кодом клавиши и отсылкой его непосредственно дереву с пом. QApplication::postEvent()

2) получить указатель на текущий элемент дерева и дальше плясать от него с помощью nextSibling() или nextChild() + setCurrentItem() и др.
Записан
izoomer
Гость
« Ответ #2 : Апрель 25, 2007, 17:22 »

Цитата: "Alex_X"
для Qt3 я бы предложил два варианта (не думаю, что для 4 сильно будет отличаться):

1) эмулировать нажатия клавишь мктодом создания QKeyEvent-а с нужным кодом клавиши и отсылкой его непосредственно дереву с пом. QApplication::postEvent()

2) получить указатель на текущий элемент дерева и дальше плясать от него с помощью nextSibling() или nextChild() + setCurrentItem() и др.


та нет, все сделал гараздо проще ... moveCursor возврщает новый QModelIndex . Следоватальн просто делаю setCurrentIndex() и все.

Но вот задача ... не знаю как реализовать алгорим сделающий следующее .... при перемещении на итем , у которого есть дочерние итемы, он должне развернуться ... и навигация дальше идет в него ... когда доходит до конца дочерних, родитель должен свернуться и переходим к следующему родителю ... то есть автоматом сворачиваться иразворачиваться .... вот ломаю голову , не знаю как сделать.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #3 : Апрель 25, 2007, 23:33 »

рекурсией ИМХО, как же еще...
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
izoomer
Гость
« Ответ #4 : Апрель 26, 2007, 15:13 »

Цитата: "Racheengel"
рекурсией ИМХО, как же еще...

понятное дело ... а вот как , алгоритм .... сделал так вот ...

перемещени на следующий ...
Код:

if ( ( listDirs->indexBelow(listDirs->currentIndex()).parent() != listDirs->currentIndex().parent() )
&& ( listDirs->indexBelow(listDirs->currentIndex()).parent() != listDirs->currentIndex() ) ) {
currentRootIndex = listDirs->currentIndex().parent();
listDirs->setCurrentIndex( listDirs->selectNextItem() );
listDirs->setExpanded(currentRootIndex, false);
qDebug() << "Если итем последний, то свернули родителя и переместили на следующий";
} else {
listDirs->setCurrentIndex( listDirs->selectNextItem() );
qDebug() << "просто переместилина следующий";
}

if ( modelDirs->hasChildren( listDirs->currentIndex() ) ){
listDirs->setExpanded(listDirs->currentIndex(), true);
qDebug() << "развернули если есть парент";
}


но не все сворачиваются при переходе с последнего итема на следующий относительно родителя.

добавлено спустя 2 минуты:

 и есче ... ПОЧЕМУ ТОРМОЗИТ программная навигация ... если кнопками up down на клвиатуре , то летает ... а если так как указано сверху, то думает перед перемещением  ... почему !?
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #5 : Апрель 26, 2007, 21:56 »

может из за qDebug() ?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
izoomer
Гость
« Ответ #6 : Апрель 28, 2007, 10:15 »

Цитата: "Racheengel"
может из за qDebug() ?

та не ... что с ними что без них одинаково .... это я уже после торомзов ввел , что бы контролировать.
Записан
Разуев Максим
Гость
« Ответ #7 : Май 08, 2007, 15:09 »

Перебирать элементы дерева можно через итератор QTreeWidgetItemIterator.
Он позволяе довольно широко контролировать выбор элемента дерева к которому надо переходить.
Получил элемент и задал его как текущий через setCurrentItem.
Я так делал для перемещения элементов дерева.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.125 секунд. Запросов: 22.