Название: прозрачный фон Отправлено: Alex Custov от Июля 31, 2008, 17:19 Имеется (упрощённо) вот такая система layout'ов:
Код: QWidget Самый верхний виджет имеет фон в виде пиксмапа, задаваемого в CSS. Необходимо, чтобы все виджеты, начиная с самого вложенного, были прозрачными. Вложенный виджет отрисовывается сам через paintEvent(). До того, как я начал использовать QScrollArea, система была немного проще: QWidget->QHBoxLayout->QWidget->QHBoxLayout->QWidget, и всё работало. Т.е. было видно, что на главном окне расположено несколько компонентов, промежуточных виджетов видно не было (по-мойму это особенность CSS в Qt -виджеты имеют прозрачный фон по умолчанию), и это было отлично. Теперь я добавил QScrollArea, код наподобие Код: area = new QScrollArea; и теперь рисуется белый фон. Попробовал установить атрибут: Код: area->widget()->setAttribute(Qt::WA_NoSystemBackground); Вроде бы всё стало опять прозрачно, но самый вложенный виджет перестал автозаполняться фоном при перерисовке, т.е. изначально он прозрачен, но все дальнейшие вызовы paintEvent() накладыватся один на один, превращая виджет в кашу. Ну и наконец вопрос - что посоветуете, чтобы заново добиться прозрачности? Спасибо. P.S. QScrollArea убирать нельзя Название: Re: прозрачный фон Отправлено: EhTemka от Июля 31, 2008, 17:56 А просто использовать setWindowOpacity для QScrollArea виджета нельзя, потому что свой paintEvent()?
Название: Re: прозрачный фон Отправлено: Alex Custov от Июля 31, 2008, 19:01 setWindowOpacity будет работать только с композитом в иксах, которого нет.
Тут проблема в том, что самый вложенный виджет не перересовывается как надо внутри своего paintEvent(). Название: Re: прозрачный фон Отправлено: Alex Custov от Июля 31, 2008, 19:36 очень странно. Глюк отловил. Собственно, сам scrollarea реализован как подсказал sprit вот тут - http://prog.org.ru/forum/index.php/topic,7526.0.html (http://prog.org.ru/forum/index.php/topic,7526.0.html). Глюк случается, когда самый вложенный виджет добавляется после старта event loop'a. Глюк не воспроизводится, если виджет добавляется перед QApplication::exec() - тогда он отрисовывается как надо. Ну что за беда-то такая? :(
Название: Re: прозрачный фон Отправлено: spirit от Июля 31, 2008, 19:39 пиши репорт троллям :)
Название: Re: прозрачный фон Отправлено: Alex Custov от Июля 31, 2008, 20:17 Потестите пожалуйста аттач. У меня Qt 4.3.3. Компиляция как обычно:
Код: # qmake Там создаётся два прозрачных виджета, при наведении мышью они должны подсвечиваться сеткой. В самом верху файла main.cpp есть define, закоментируйте его, чтобы посмотреть как должно работать. Если #define вернуть обратно, виджеты будут смазываться. Название: Re: прозрачный фон Отправлено: spirit от Июля 31, 2008, 20:21 Потестите пожалуйста аттач. У меня Qt 4.3.3. Компиляция как обычно: смазываение есть, если закомментить макрос, но в тоже время , если много раз по виджету мышакой поводить, то все становится однин в один как в случае с раскоменченным макросом.Код: # qmake Там создаётся два прозрачных виджета, при наведении мышью они должны подсвечиваться сеткой. В самом верху файла main.cpp есть define, закоментируйте его, чтобы посмотреть как должно работать. Если #define вернуть обратно, виджеты будут смазываться. Название: Re: прозрачный фон Отправлено: Alex Custov от Июля 31, 2008, 20:43 Хм, на моей версии Qt с закоментированным макросом всё работает как надо...
Название: Re: прозрачный фон Отправлено: spirit от Июля 31, 2008, 20:51 а что должно получится в результате?
Название: Re: прозрачный фон Отправлено: spirit от Июля 31, 2008, 20:56 у меня походу вообще нифига не меняется есть макрос или нет.
Название: Re: прозрачный фон Отправлено: Alex Custov от Июля 31, 2008, 21:00 В результате каждый вложенный виджет должен подсвечиваться при наведении мышкой, и быть прозрачным иначе. Блин, без scrollarea всё пучком, но без него нельзя - виджетов может быть много, и они могут не вместиться.
С макросом отрисовка превращается в кашу. Название: Re: прозрачный фон Отправлено: pastor от Июля 31, 2008, 21:03 У меня что с макросом что без него поведение совершенно одинаково. Сетка рисуется каждый раз поверх предыдущей
Название: Re: прозрачный фон Отправлено: Alex Custov от Июля 31, 2008, 21:05 а на какой версии Qt?
Название: Re: прозрачный фон Отправлено: spirit от Июля 31, 2008, 21:12 4.3.5
Название: Re: прозрачный фон Отправлено: pastor от Июля 31, 2008, 21:15 4.4.1 под вендой
Через мин 10 проверю под линуксом на 4.4.0 Название: Re: прозрачный фон Отправлено: Alex Custov от Июля 31, 2008, 21:25 вот переделал без scrollarea, всё работает хорошо. Посмотрите и этот пример пожалуйста. Там 3 вложенных виджета в hboxlayout'е, каждый должен подсвечиваться нормально. Под виндой результат конечно может отличаться, но мне бы заставить работать хотя бы в Linux :)
Название: Re: прозрачный фон Отправлено: pastor от Июля 31, 2008, 21:35 Интересная ситуация получаеться. Под линуксом пример со scrollarea работает нормально как с макросом так и без него. Ситуация полностью противоположная чем винде.
openSuse 10.3, Qt 4.4.0 Название: Re: прозрачный фон Отправлено: spirit от Июля 31, 2008, 21:47 да уж, странно. этот пример пашет на ура под виндой. очень интересно.
Название: Re: прозрачный фон Отправлено: Alex03 от Августа 01, 2008, 08:07 У меня WinXP Qt 4.3.3
Исходный пример не работал в обоих случаях Подправил до такого (поиграйтесь со значениями TEST, да и прочими дефайнами): Код: #define TEST 2 Ещё я не понимаю зачем генерить такой бутерброд, можно ж потоньше, раскоментарьте Код: //#define INHERIT_SCROLL_AREA 1 Также непонятно желание совместно использовать Код: area->setWidgetResizable(true); Код: area->widget()->resize(w < area->viewport()->width() ? area->viewport()->width() : w, h); Ну и ИМХО если уж тользовать SсrollХХХХ то пользовать, а отрисовку всяко полезно отлаживать в различныз геометриях, а не с фикседсайз. Да и нулевые MARGIN-ы/SPACING-и тоже при отладке не есть гуд. Название: Re: прозрачный фон Отправлено: Alex Custov от Августа 01, 2008, 09:51 Хм... весьма странно. Проблема решилась заменой
Код: area->widget()->setAttribute(Qt::WA_NoSystemBackground); Код: area->viewport()->setAutoFillBackground(false); в оригинальном примере. наверно сыграло роль то, что setAutoFillBackground не совсем хорошо документирован, поэтому я его не учёл :) Отдельное спасибо Alex03 за проделанную работу, которая и навела меня на мысль :) Такой бутерброд необходим, т.к. самый верхний виджет и его layout - не мои, я туда вставляю свой плагин, который и будет наследником QScrollArea. |