Russian Qt Forum

Qt => Qt Quick => Тема начата: kuzulis от Январь 15, 2015, 18:24



Название: Как управлять контролами и их анимацией программно (без мыши, тача, клавиатуры)?
Отправлено: kuzulis от Январь 15, 2015, 18:24
Всем доброго времени.

Интересует такой вопрос:

Есть ли возможность управлять QtQuick виждетами программно из QML кода без участия клавиатуры и мышки?

Например будет нужно написать приложуху для некоего ембеддед девайса в котором нету клавы и мышки.
Нужно например по неким командам из сети (в общем случае из некоего коммуникационного интерфейса - не важно)
выбирать текущие айтемы из ListView, жмакать кнопочки и прочая анимация так чтобы было красиво (как будто
это делается как обычно - мышкой или кнопочками на клавиатуре).

Посмотрел сейчас на примерчики типа ModelView (ListView и прочее) в части подсветки выделеных айтемов -
но там везде используется MouseArea с onClick() обработчиками и прочее.

Но в моем случае нужно это делать программно, т.к. нету мышки :).

В принципе, я смог-бы программно менять текущие индексы у списка:
Код
ListView.currentIndex =  
но тут не понятно: будут или нет автоматом эти айтемы подсвечиваться и прочее (будут ли срабатывать делегаты ?).
Конечно, можно это попробовать и проверить самостоятельно (в чем проблема то? :)), но хотелось бы узнать у
авторитетных программеров - как это лучше делать и возможно ли вообще?  
самому, но все-же ?

ЗЫ: Нужно еще эмулировать такие действия как наведение на элемент, выбор элемента и присваивать им разную
анимацию/трансформацию и прочее в зависимости от действия.


Название: Re: Как управлять контролами и их анимацией программно (без мыши, тача, клавиатуры)?
Отправлено: RSATom от Январь 15, 2015, 18:43
При острой необходимости можно просто посылать фиктивные сообщения мыши в QQuickView и тогда все будет абсолютно идентично.

вот пример (неполный, просто для демонстрации идеи)

Код
C++ (Qt)
   QPointF mousePoint( e->m_x, e->m_y );
   QMouseEvent mouseEvent( QEvent::MouseButtonPress, mousePoint, mousePoint,
                           button, button, Qt::NoModifier );
   QCoreApplication::sendEvent( m_quickViewPtr.data(), &mouseEvent );
 


Название: Re: Как управлять контролами и их анимацией программно (без мыши, тача, клавиатуры)?
Отправлено: kuzulis от Январь 16, 2015, 13:58
Итак, чтобы полностью игнорировать все евенты от мышки необходимо декларировать
MouseArea в самом конце корневого элемента (так, чтобы оно заполняло весь элемент).

Код
Rectangle { // корневой элемент
   id: root
   ...
   Item { // some item 1
   }
   ...
   Item { // some item N
   }
   ...
   MouseArea { // Вот это отключит все обработчики от мышки! ВАЖНО: оно должно быть обязательно в конце корневого элемента!
       anchors.fill: parent
   }
}
 

UPD: Но проще, установить eventFilter на весь QApp из C++-шного кода (чтобы все нужные евенты как от мышки так и от
клавиатуры заигнорить), чем что-то ковырять в QML. Т.к. управление фокусом от клавиатуры и событиями от клавиатуры
 в QML реализовано "убого"  (это на IRC посоветовали/подсказали). :)