LINUX.ORG.RU

Qt. PaintEvent. Анимация. Android vs. Linux

 , ,


0

1

Для создания короткой и тривиальной анимации используется код вроде такого:
void function start()
{
функция-для-изменения-кадра();
функция-рано-или-поздно-вызывающая-repaint-целевого-виджета();
usleep(200000);
...
И так несколько раз.
}

На линуксе это прекрасно работает.
А вот из-под андроида я вижу лишь последний «кадр».
При этом я впихнул в paintEvent счётчик и из-под андроида paintEvent вызывается правильное количество раз.
Возможно это какая-то переоптимизиция для тормозного андроида, но вопрос такой:
Каким тривиальным образом организовать перерисовку виджета несколькими последовательными кадрами через некоторые различные промежутки времени из-под андроида?

★★☆

Так ведь для анимаций специальный класс был — не проще ли его использовать?
// Сам с анимациями не сталкивался

XMs ★★★★★
()
Ответ на: комментарий от CrossFire

Мне потом этот виджет нужен будет для
отрисовки (аналогичным, как в анимации, но более завязанным на действия пользователя способом) всего остального. Просто первая порция данных у меня уже есть и её хотелось бы показать пользователю.

Stahl ★★☆
() автор топика
Последнее исправление: Stahl (всего исправлений: 1)

1. usleep(200000) - говорили же уже - только по таймеру, зачем быдлокодишь?
2. функция-рано-или-поздно-вызывающая-repaint-целевого-виджета() - qApp->processEvents она вызывает?

dib2 ★★★★★
()
Ответ на: комментарий от dib2

repaint

видимо, да. Есть update() а есть repaint().

только по таймеру, зачем быдлокодишь?

Что ты подразумеваешь под таймером? Qt-специфичные штуки я использовать не могу.

Stahl ★★☆
() автор топика
Ответ на: комментарий от Stahl

qApp->processEvents
видимо, да. Есть update() а есть repaint().

видимо нет. а попробуй, может понадобится.

Что ты подразумеваешь под таймером? Qt-специфичные штуки я использовать не могу.

startTimer(), QTimer.
используешь QWidget, но при этом не можешь QTimer для анимации? Уж сильно это странно.

dib2 ★★★★★
()
Ответ на: комментарий от dib2

используешь QWidget, но при этом не можешь QTimer для анимации? Уж сильно это странно.

QWidget ничего не знает про анимации. Это не его дело. Просто приходят данные и он их рисует. А вне виджета — нормальный плюсовый код без всяких Qt. Я не могу там использовать QЧто_то-там.

qApp->processEvents

Ну гляну, конечно, но я не понимаю ход твоих мыслей — paintEvent вызывается нужное количество раз. Вроде всё должно быть ок. И из-под линукса вообще всё работает ожидаемым образом. Проблема с андроидом.

Stahl ★★☆
() автор топика
Ответ на: комментарий от dib2

видимо нет. а попробуй, может понадобится.

QCoreApplication::exec: The event loop is already running
Т.е. тут всё ок.

Stahl ★★☆
() автор топика
Ответ на: комментарий от Stahl

QWidget ничего не знает про анимации. Это не его дело.

интересно, а чье же тогда если не View?

Просто приходят данные и он их рисует.

нахрена тогда sleep? данные складываются, и отображаются в том виде, в котором это призван делать View, включая анимации

QCoreApplication::exec: The event loop is already running

ты вызываешь qApp->processEvents() и получаешь это? уверен?

dib2 ★★★★★
()
Ответ на: комментарий от dib2

нахрена тогда sleep?

Это задержка между «кадрами».

ты вызываешь qApp->processEvents() и получаешь это? уверен?

Я дёрнул QCoreApplication::processEvents() сразу после repaint();

Stahl ★★☆
() автор топика
Ответ на: комментарий от Stahl

Это задержка между «кадрами»

т.е. все-таки QWidget решает когда рисовать. Зачем тогда блокировать основной поток спячкой, если это делается таймерами?

dib2 ★★★★★
()
Ответ на: комментарий от pashazz

какая религия запрещает использовать QTimer внутри QWidget

В QWidget? Там — легко. Вот только что этот таймер там будет делать?
Виджет принимает 200-300 байт информации и превращает его в изображение, которое рисует на себе.
Данные, на базе которых генерируется изображение, формируются сторонними классами, которые ничего про Qt не знают.
Они просто скармливают виджету свои цифры и радуются жизни.
Я хочу лишь скормить виджету несколько блоков данных с некоторой задержкой между ними. Кормить должен класс ничего не знающий про Qt.
Зачем мне QTimer?

Stahl ★★☆
() автор топика
Ответ на: комментарий от dib2

т.е. все-таки QWidget решает когда рисовать.

Да нет же! Нихрена он не рашает. Ему впихивают данные и он рисует. Всё! Когда впихнут, тогда и нарисует.

Stahl ★★☆
() автор топика

Откуда ты вызываешь этот код?

KblCb ★★★★★
()

usleep(200000);

Qt,Gtk,Tk и прочие Wx - событийно ориентированные фреймворки. Если задержку между кадрами ставишь не используя их таймер или какой-нить затыки типа update - то ССЗБ. Так нельзя. Отрисовка/обновление виджета это такой неслабый процесс который отрабатывается не только в самом по себе виджете.

MKuznetsov ★★★★★
()

Пили свой mainLoop и будет у тебя счастье.

Делается это элементарно. Я в свое время потратил около 4х вечеров на написание кроссплатформы для Android/Linux с бекендом Qt/Linux и NDK/Android. Везде рисовал через OpenGL и был счастлив.

trex6 ★★★★★
()
Ответ на: комментарий от Stahl

Да нет же! Нихрена он не рашает. Ему впихивают данные и он рисует. Всё! Когда впихнут, тогда и нарисует.

тогда он бы не делал задержек. короче, хочешь чтобы нормально рисовалось везде - рисуй в paintEvent(), а обновление вызывай по таймеру, и данные здесь совсем не при чем. Так как ты делаешь - нельзя.

dib2 ★★★★★
()
Ответ на: комментарий от anonymous

юзаешь поделку qml

Но я не использую qml и не должен страдать! :)

Stahl ★★☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.