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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: прозрачный фон  (Прочитано 12995 раз)
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« : Июль 31, 2008, 17:19 »

Имеется (упрощённо) вот такая система layout'ов:

Код:
  QWidget
+------------------------------------------+
| QHBoxLayout                              |
| +--------------------------------------+ |
| | QScrollArea                          | |
| | +----------------------------------+ | |
| | | QWidget                          | | |
| | | +------------------------------+ | | |
| | | | QHBoxLayout                  | | | |
| | | | +--------------------------+ | | | |
| | | | | QWidget                  | | | | |
| | | | | +----------------------+ | | | | |
| | | | | |                      | | | | | |
| | | | | |                      | | | | | |
| | | | | |                      | | | | | |
| | | | | |                      | | | | | |
| | | | | +----------------------+ | | | | |
| | | | +--------------------------+ | | | |
| | | +------------------------------+ | | |
| | +----------------------------------+ | |
| +--------------------------------------+ |
+------------------------------------------+

Самый верхний виджет имеет фон в виде пиксмапа, задаваемого в CSS. Необходимо, чтобы все виджеты, начиная с самого вложенного, были прозрачными. Вложенный виджет отрисовывается сам через paintEvent().

До того, как я начал использовать QScrollArea, система была немного проще: QWidget->QHBoxLayout->QWidget->QHBoxLayout->QWidget, и всё работало. Т.е. было видно, что на главном окне расположено несколько компонентов, промежуточных виджетов видно не было (по-мойму это особенность CSS в Qt -виджеты имеют прозрачный фон по умолчанию), и это было отлично.

Теперь я добавил QScrollArea, код наподобие

Код:
    area = new QScrollArea;
    area->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
    area->setWidget(new QWidget);
    area->setWidgetResizable(true);

и теперь рисуется белый фон. Попробовал установить атрибут:

Код:
    area->widget()->setAttribute(Qt::WA_NoSystemBackground);

Вроде бы всё стало опять прозрачно, но самый вложенный виджет перестал автозаполняться фоном при перерисовке, т.е. изначально он прозрачен, но все дальнейшие вызовы paintEvent() накладыватся один на один, превращая виджет в кашу.

Ну и наконец вопрос - что посоветуете, чтобы заново добиться прозрачности? Спасибо.

P.S. QScrollArea убирать нельзя
Записан
EhTemka
Гость
« Ответ #1 : Июль 31, 2008, 17:56 »

А просто использовать setWindowOpacity для QScrollArea виджета нельзя, потому что свой paintEvent()? 
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #2 : Июль 31, 2008, 19:01 »

setWindowOpacity будет работать только с композитом в иксах, которого нет.

Тут проблема в том, что самый вложенный виджет не перересовывается как надо внутри своего paintEvent().
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #3 : Июль 31, 2008, 19:36 »

очень странно. Глюк отловил. Собственно, сам scrollarea реализован как подсказал sprit вот тут - http://prog.org.ru/forum/index.php/topic,7526.0.html. Глюк случается, когда самый вложенный виджет добавляется после старта event loop'a. Глюк не воспроизводится, если виджет добавляется перед QApplication::exec() - тогда он отрисовывается как надо. Ну что за беда-то такая?  Грустный
Записан
spirit
Гость
« Ответ #4 : Июль 31, 2008, 19:39 »

пиши репорт троллям  Улыбающийся
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #5 : Июль 31, 2008, 20:17 »

Потестите пожалуйста аттач. У меня Qt 4.3.3. Компиляция как обычно:

Код:
# qmake
# make
# ./qs

Там создаётся два прозрачных виджета, при наведении мышью они должны подсвечиваться сеткой. В самом верху файла main.cpp есть define, закоментируйте его, чтобы посмотреть как должно работать. Если #define вернуть обратно, виджеты будут смазываться.
Записан
spirit
Гость
« Ответ #6 : Июль 31, 2008, 20:21 »

Потестите пожалуйста аттач. У меня Qt 4.3.3. Компиляция как обычно:

Код:
# qmake
# make
# ./qs

Там создаётся два прозрачных виджета, при наведении мышью они должны подсвечиваться сеткой. В самом верху файла main.cpp есть define, закоментируйте его, чтобы посмотреть как должно работать. Если #define вернуть обратно, виджеты будут смазываться.
смазываение есть, если закомментить макрос, но в тоже время , если много раз по виджету мышакой поводить, то все становится однин в один как в случае с раскоменченным макросом.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #7 : Июль 31, 2008, 20:43 »

Хм, на моей версии Qt с закоментированным макросом всё работает как надо...
Записан
spirit
Гость
« Ответ #8 : Июль 31, 2008, 20:51 »

а что должно получится в результате?
Записан
spirit
Гость
« Ответ #9 : Июль 31, 2008, 20:56 »

у меня походу вообще нифига не меняется есть макрос или нет.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #10 : Июль 31, 2008, 21:00 »

В результате каждый вложенный виджет должен подсвечиваться при наведении мышкой, и быть прозрачным иначе. Блин, без scrollarea всё пучком, но без него нельзя - виджетов может быть много, и они могут не вместиться.

С макросом отрисовка превращается в кашу.
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #11 : Июль 31, 2008, 21:03 »

У меня что с макросом что без него поведение совершенно одинаково. Сетка рисуется каждый раз поверх предыдущей
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #12 : Июль 31, 2008, 21:05 »

а на какой версии Qt?
Записан
spirit
Гость
« Ответ #13 : Июль 31, 2008, 21:12 »

4.3.5
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #14 : Июль 31, 2008, 21:15 »

4.4.1 под вендой

Через мин 10 проверю под линуксом на 4.4.0
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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