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

Войти
 
  Начало Форум WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  
  Просмотр сообщений
Страниц: [1] 2 3 ... 83
1  Qt / Qt Embedded / Эффекты боковых шторок в Android : Сегодня в 01:21
В Андроиде принято делать приложения, у которых по свайпу слева или справа появляются дополнительные "шторки" приложений. Там могут быть разные меню, настройки и т.д. Ну ладно, свайп я как-нибудь сам поймаю. А все эти шторки на Qt как - самому руками двигать? Или может для этого средства есть? А может есть идеальные? - Назначить на свайп слева появление слева окна, в котором можно свои виджеты расположить, и чтобы это окно автоматом подстраивалось под размеры экрана. Есть вообще такое для Qt?
2  Qt / Qt Embedded / Re: (РЕШЕНО) Странный глюк в Android - баг в Qt или Android : Апрель 11, 2017, 20:44
Окончательное решение, которое работает, без использования Java кода, не шибко элегантное, но простое.
В приватных свойствах класса виджета, наследующего QFrame:
Код:
QRect geo;
Где-то в конструкторе или инициализации виджета, лишь бы пораньше:
Код:
geo = geometry();
В начале paintEvent() этого виджета пишем:
Код:
   if( geo != geometry() )
        setGeometry( geo );

Дальнейшее нужно, если геометрия виджета может меняться в процессе работы приложения. Надо не забывать при каждом таком изменении сохранять новую геометрию в geo = geometry();. Кроме этого, в классе виджета заводим слот:
Код:
void screenWasLocked(){ geo = geometry(); }
В объявлении класса главного окна приложения, которое наследует QMainWindow создаём сигнал:
Код:
   void screenIsLocked();
Ниже него слот:
Код:
void appStateChanged(Qt::ApplicationState state)
{
    if( state == Qt::ApplicationSuspended )
        emit screenIsLocked();
}
Где-нибудь в конструкторе этого класса:
Код:
   connect(QApplication::instance(), SIGNAL(applicationStateChanged(Qt::ApplicationState)), SLOT(appStateChanged(Qt::ApplicationState)));
И, наконец, в дизайнере соединяем сигнал screenIsLocked() главного окна со всеми слотами screenWasLocked() всех виджетов, которые расположены на форме. Всё.

Это работает. Каждый раз при перерисовке QFrame будет выполняться лишнее сравнение с вызовом geometry(), но это стоит недорого.
3  Qt / Qt Embedded / Re: (РЕШЕНО) Странный глюк в Android - баг в Qt или Android : Апрель 11, 2017, 19:13
Не, ну ваще... сделал топором - сохраняю геометрию при залочивании экрана, и вызываю восстановление при разлочивании. В дебаг выводе всё хорошо, восстановилось. Но потом по чьему-то желанию происходит ещё одна перерисовка, и бабах! Виджетов три штуки, в paintEvent перед рисованием у каждого выводится
Код:
       qDebug()<<"repaint"<<"frame"<<frameRect()<<"geometry"<<geometry();
и получаю вот такое:
Цитировать
D/AlpsGL17(24511): (null):0 ((null)): repaint frame QRect(0,0 307x21) geometry QRect(471,320 307x21)
D/AlpsGL17(24511): (null):0 ((null)): repaint frame QRect(0,0 83x30) geometry QRect(471,270 83x30)
D/AlpsGL17(24511): (null):0 ((null)): repaint frame QRect(0,0 307x20) geometry QRect(471,340 307x20)
D/AlpsGL17(21709): (null):0 ((null)): repaint frame QRect(0,0 307x21) geometry QRect(471,320 307x21)
D/AlpsGL17(21709): (null):0 ((null)): repaint frame QRect(0,0 83x30) geometry QRect(471,270 83x30)
D/AlpsGL17(21709): (null):0 ((null)): repaint frame QRect(0,0 307x20) geometry QRect(471,340 307x20)
D/AlpsGL17(21709): (null):0 ((null)): repaint frame QRect(0,0 1280x752) geometry QRect(471,320 1280x752)
D/AlpsGL17(21709): (null):0 ((null)): repaint frame QRect(0,0 1280x752) geometry QRect(471,270 1280x752)
D/AlpsGL17(21709): (null):0 ((null)): repaint frame QRect(0,0 1280x752) geometry QRect(471,340 1280x752)

То есть, сначала рисует виджеты правильного размера, а потом сразу испорченного. И это уже после того, как экран разблокирован. Но! Только если экран в положении портрет. В положении ландшафт при тех же действиях только один раз:

D/AlpsGL17(24511): (null):0 ((null)): repaint frame QRect(0,0 307x21) geometry QRect(471,320 307x21)
D/AlpsGL17(24511): (null):0 ((null)): repaint frame QRect(0,0 83x30) geometry QRect(471,270 83x30)
D/AlpsGL17(24511): (null):0 ((null)): repaint frame QRect(0,0 307x20) geometry QRect(471,340 307x20)[/quote]

И разумеется всё нормально.

Отсюда единственный выход виден - сохранять размеры этих трёх виджетов при старте приложения, и использовать их для рисования в paintEvent(). Потому что где портится геометрия, выяснить уже становится совсем сложно. Правда тогда придётся отслеживать изменение размеров в дизайнере, поскольку там они вполне могут изменяться.
4  Qt / Qt Embedded / Re: (РЕШЕНО) Странный глюк в Android - баг в Qt или Android : Апрель 11, 2017, 17:19
Баг запостил? Улыбающийся

Да, конечно. QTBUG-60101.

Вот как его обойти - пока ещё не решил. Могу, конечно, повесить в Java коде обработчик события блокировки клавиатуры (для screen lock/unlock отдельного события в Android нет) и вызывать из него Native функцию, дальше из неё сигнал, и по нему в виджете сохранять и восстанавливать геометрию QFrame. Этот вариант понятен. Но может есть вариант какой-то более элегантный, чем топор... Думаю.

Сигнал QCoreApplication::applicationStateChanged(Qt::ApplicationActive) не хиляет - он посылается до фактической разблокировки, когда виджет ещё имеет нормальный размер.
5  Qt / Пользовательский интерфейс (GUI) / События или сигналы про screen lock/unlock : Апрель 11, 2017, 16:54
Поиском не нахожу, на память не помню чтобы встречалось в описаниях. Но может пропустил. Этого на самом деле в Qt нет? Недостаток, однако...
6  Qt / Qt Embedded / Re: Странный глюк в Android 6 : Апрель 11, 2017, 15:03
Опа, опа - есть баг в Qt! В paintEvent() виджета я использую вызов frameRect() чтобы получить прямоугольник для заливки фона. По неизвестной причине (очевидно дыра в Qt для Android или в самом Android) если включена блокировка устройства и экран повёрнут в портрет, то эта функция возвращает не прямоугольник самого виджета, а... прямоугольник экрана. Причём она возвращает также прямоугольник экрана и после того, как блокировка снимается, и экран переводится в ландшафт. Если блокировка не включена, или если экран блокируется в ландшафте - то всё работает нормально. Может быть, это дырка и не Qt, а самого Android, но она срабатывает в версиях Android 4.0.3 и 6.0.

Ну да, не просто frameRect() портится - а geometry(). Причём это происходит только с QFrame.

7  Qt / Qt Embedded / Re: Странный глюк в Android 6 : Апрель 10, 2017, 23:10
Чуть-чуть удалось продвинуться - выяснил, что из трёх виджетов, один перерисовывается (вызывается его paintEvent()) в момент до того как снята блокировка экрана, или даже во время её снятия, а два других после этого. Вот тот, который рисуется до снятия блокировки, и ломает всю консерваторию. Отложить рисование до окончания снятия блокировки пока не получилось. Перерисовка всего окна после снятия блокировки вызовом repaint() тоже ничего не даёт.

ЗЫ

Ситуация ещё хуже. Портится структура виджета, который перерисовывается до снятия блокировки. Если виджет динамически убрать, он пропадает. Но если его вернуть - он рисуется с тем же искажением.

Вот же блин...
8  Qt / Qt Embedded / Re: Странный глюк в Android 6 : Апрель 06, 2017, 22:57
О! Смог поймать этот же глюк в Android 4 SDK level 15. Проблема не характерна для Android 6. Это как-то обнадёживает - в Android 4 у меня хотя бы отладка работает нормально.
9  Qt / Qt Embedded / Re: Странный глюк в Android 6 : Апрель 06, 2017, 20:34
Просто беда какая-то... Если вручную включить блокировку экрана, то после возврата получается опять искажённый экран приложения. Пытался и графическую сцену перерисовывать, и просто окно обновлять - ничего не помогает. Борьба осложняется ещё тем, что почему-то не работает qDebug() - возможно из-за того, что ОС level 23, а приложение собрано с SDK level 15. А может какие-то особые разрешения нужны, это же пендитный 6-й Android.
10  Qt / Qt Embedded / Re: Странный глюк в Android 6 : Апрель 05, 2017, 23:35
В общем, пока не нашёл другого решения, кроме как на время работы приложения запретить залочивание девайса. Это, в общем-то, логично, поскольку приложение у меня творит разные визуализации, а они подразумевают, что экран во время их показа всё время включен.
11  Qt / Qt Embedded / Re: Странный глюк в Android 6 : Апрель 05, 2017, 18:52
Чуть лучше локализовал момент появления проблемы - она возникает, если устройство было залочено. То есть, на экране лок-скрин, и требуется идентификации для снятия блокировки. При этом лок-скрин всегда нарисован в портретной ориентации (это же смартфон). Вот после того, как исчезает lock-screen, моё приложение рисуется неправильно. Но в остальных случаях, если на экране было другое приложение, независимо от ориентации экрана, или экран был погашен, но ещё не заблокирован - всё работает нормально.

Возможно, проблема связана с не совсем корректной работой лончера или что там управляет блокировкой - но в других приложениях она не проявляется. Впрочем... они и не на С++ написаны. А на других устройствах с Android у меня просто нет экрана блокировки, поэтому на них проблема не появляется.
12  Qt / Qt Embedded / Re: Странный глюк в Android 6 : Апрель 05, 2017, 13:06
Я например с андроид 6 вообще не сталкивался )
Кроме как минимальный эзкейс и спросить на https://forum.qt.io/  я выхода не вижу в решении проблемы.
Спасибо, кэп... Просьба всем, кто захочет отозваться - пишите только если хотя бы в курсе в чём проблема.
13  Qt / Qt Embedded / (РЕШЕНО) Странный глюк в Android - баг в Qt или Android : Апрель 04, 2017, 22:55
На окне приложения есть несколько моих виджетов, наследующих QFrame, назовём их TextLabel. От оригиналов отличаются возможностью кучи вещей - настройкой шрифтов, цвета фона и цвета текста в дизайнере, скроллингом и т.д. Все параметры задаются в пропертях, поскольку этот класс сделан плагином дизайнера. Всё работает замечательно во всех ОС, включая Windows, Linux, Android 4 и 5, но кроме одного непонятного пока глюка в Android 6. Фишка ещё в том, что приложение работает строго в ландшафтном режиме. Когда приложение запускаешь - всё замечательно, оно работает, если не давать смартфону уснуть, то есть выключить экран. При выходе смартфона из "сна", то есть при включении экрана, он первоначально оказывается в портретной ориентации, независимо от того, как повёрнут смартфон. Но тут же переворачивается в ландшафт, и в большом количестве случаев происходит нечто необъяснимое - один из виджетов TextLabel, который лежит выше всех остальных TextLabel, "размазывается" влево и вниз до краёв экрана, и закрывает всё, что под него попало (но разумеется кроме виджетов, которые лежат над ним). При этом как этот, так и другие TextLabel (даже те, которые оказались не перекрыты) перестают отображать находящийся в них текст, они становятся "пустыми". Очевидно размазывается только изображение, но не геометрия виджета - поскольку все активные виджеты под ним по-прежнему реагируют на события, то есть, если там оказались кнопки, то они нажимаются, отрабатывают как положено. Только не видны.

На устройствах с Android 4 и 5 ничего подобного не происходит - на них экран при включении из сна сразу находится в ландшафте, и приложение нормально отображается всегда. Так происходит, даже если держать устройство "в портрет". Есть одна фишка, которая может иметь значение - приложение собрано с Android SDK level 15, то есть, под Android 4.0.3 ICS. Но более нигде не возникло каких-либо иных проблем с отображением, функционированием и т.д. А приложение довольно сложное, и использует много чего, включая использование многих функций ОС через Java-интерфейс (которые на уровне Qt не реализованы). Есть там и анимированные SVG, и меняющие прозрачность растровые картинки - ничего из этого не вызывает проблем.

Может кто встречался с чем-то подобным? Конечно, у меня тоже может быть багоплюха, хотя код TextLabel достаточно давно написан, не раз вылизывался, и как-то сомнений совершенно не вызывал.
14  Qt / Qt Embedded / Re: Qt 5.6 и Android 6 : Март 29, 2017, 21:19
Ага. Я сегодня получил смарт Huawei Honor 6x с 6-м Android. Только что проверил - установил свои приложения, они работают, но не полностью. После возврата из ждущего режима почему-то не корректно перерисовывается экран.  Непонимающий Часть отрисована не правильно, залита цветом текстового поля, которое у меня есть. И не ясно, как это исправить без корректировки кода. И почему-то не изменяется текст в текстовых полях. На Android 4 всё это работает. Придётся ковыряться...
15  Qt / Пользовательский интерфейс (GUI) / А что за беда с жестами типа Qt::PanGesture? : Март 27, 2017, 19:53
Это у меня обнаружилось в Андроиде, но вообще вопрос для всех случаев, когда есть тачскрин. И имеет больше отношение к пользовательском интерфейсу. Поэтому пишу здесь.

Не работает Pan Gesture, ни в какую. Если елозить пальцем, то генерит событие QEvent::HoverMove, но не QEvent::Gesture. Разрешение grabGesture(Qt::PanGesture); есесно есть. Теоретически это не принципиально, хотя с PanGesture несколько проще - он сразу дельту выдаёт.

Порыл в Сети, и ничего толком не нашёл на эту тему, кроме нескольких невнятных баг-репортов.

Может кто видел что-то внятное? Или знает как отработку жестом включить?

Кстати, та же фигня с простым тапом по экрану - нет его, хотя такой жест в списке есть. Нужен был, на самом деле, дабл тап - подвесил обработку дабл клика мышкой. Вроде работает, но хрен его знает как это потом со следующими версиями Qt отзовётся.
Страниц: [1] 2 3 ... 83
Страница сгенерирована за 0.065 секунд. Запросов: 23.