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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: (РЕШЕНО) Нет (есть на самом деле) прозрачности у главного окна в Android  (Прочитано 3315 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Ноябрь 30, 2016, 17:18 »

Начал писать без всякой надежды... Сделал главное окно приложения для Android прозрачным с помощью android:theme="@android:style/Theme.Translucent" в секции <application...> в AndroidManifest.xml. Для пущей уверенности понаписал
Код:
    MainWindow w;
    w.setAttribute( Qt::WA_NoSystemBackground );
    w.setAttribute( Qt::WA_TranslucentBackground );
    w.setAttribute( Qt::WA_OpaquePaintEvent, false );
    w.setWindowFlags( Qt::FramelessWindowHint );
    w.show();
в main(). Нифига. Фон окна глухо чёрный, через него ничего не видно. Правда при запуске заметно, как на фоне мигает экран приложения под окном. То есть, сначала всё чёрное, потом появляется мое окно, на долю секунды через него видно лончер, и потом весь фон становится чёрным. Похоже - баг в Qt, причём другие на него тоже нарывались. Полупрозрачный фон с помощью задания стиля тоже не работает - виноват явно не Android, он честно делает фон прозрачным, но Qt почему-то заливает его.
.................
Пока писал, пришла мысль в голову. Заменил всё в main() на

Код:
    MainWindow w;
    QPalette p;
    p.setColor(QPalette::Background, QColor(0,0,0,0));
    w.setPalette(p);
    w.show();

И заработало! Оставлю всё-таки сообщение тут - наверняка кому-нибудь ещё пригодится. В Сети сколько лазил - такого решения нигде не видел, но видел, что несколько человек упирались.

Записан

2^7-1 == 127, задумайтесь...
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #1 : Декабрь 07, 2016, 16:57 »

А вот с передачей событий типа тапов и жестов через прозрачную область ничего не получается.  Грустный Пробовал самые разные варианты, делал окно размером меньше десктопа, включал разрешение SYSTEM_ALERT_WINDOW - никак. Пытался сделать View в JNI коде, но не знаю как получить layout ID моего приложения. Не нашёл работающий способ. Возможно для приложения на Qt его нет. В приложениях на чистой Java для приложения создают layout, описанный в XML, затем делают с его помощью overlay window. С Qt-окнами это не заработало. Если кто знает как получить работающее решение для Qt - пишите.

Также не получается сделать окно с изменяемым размером и нормальной перерисовкой при этом. Если просто масштабировать окно под заданный размер с уменьшением, то вокруг него не перерисовывается фон, за который отвечает уже Android. Способ заставить его перерисовать принудительно тоже не нашёл - для этого нужно получить системный View десктопа Android послать сигнал на необходимость перерисовки. Но получить этот View не удалось. Знатоки Android дали понять, что это невозможно.

И не получилось сделать окно always on top - все описанные для Android способы перепробовал, флаг Qt::WindowStaysOnTopHint для окна устанавливал. Но постоянно окно на экране не сохраняется, при переключении на другое приложение исчезает.

Кстати, атрибуты Qt::WA_NoSystemBackground и Qt::WA_OpaquePaintEvent, а также флаг Qt::FramelessWindowHint на прозрачность окна не влияют. Нужен только флаг Qt::WA_TranslucentBackground, задание цвета палитры и использование прозрачной темы манифесте. При этом установка последнего параметра цвета палитры задаёт полупрозрачность, хорошо получается с уровнем 120.

И ещё трюк - если надо, чтобы виджеты по прозрачному окну перемещались или масштабировались, и фон под окном при этом правильно перерисовывался, то нужно сделать такой код для его paintEvent():

Код:
void MainWindow::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    QPainter::CompositionMode m = painter.compositionMode();
    painter.setCompositionMode(QPainter::CompositionMode_Source);
    painter.setOpacity(0.0);
    painter.fillRect(rect(), Qt::black);
    painter.setCompositionMode(m);
}
« Последнее редактирование: Декабрь 07, 2016, 17:14 от Гурман » Записан

2^7-1 == 127, задумайтесь...
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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