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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как управлять контролами и их анимацией программно (без мыши, тача, клавиатуры)?  (Прочитано 2315 раз)
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« : Январь 15, 2015, 18:24 »

Всем доброго времени.

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

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

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

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

Но в моем случае нужно это делать программно, т.к. нету мышки Улыбающийся.

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

ЗЫ: Нужно еще эмулировать такие действия как наведение на элемент, выбор элемента и присваивать им разную
анимацию/трансформацию и прочее в зависимости от действия.
« Последнее редактирование: Январь 15, 2015, 18:32 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
RSATom
Гость
« Ответ #1 : Январь 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 );
 
« Последнее редактирование: Январь 15, 2015, 18:48 от RSATom » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #2 : Январь 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 посоветовали/подсказали). Улыбающийся
« Последнее редактирование: Январь 16, 2015, 14:08 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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