Название: Празрачность виджета. Отправлено: beginner от Апреля 04, 2006, 03:23 Перегружаю void paintEvent( QPaintEvent * ), рисую, но не на всем виджете. Хочется, что б место под незарисованной частью было прозрачным. Как это сделать?
Название: Празрачность виджета. Отправлено: Dendy от Апреля 04, 2006, 09:43 Попробуй прочитать здесь:
http://prog.org.ru/forum/topic_1964_4701b77b1aaa095e419c4215d42ca629.html Название: Re: Празрачность виджета. Отправлено: QCasper от Апреля 04, 2006, 16:59 Цитата: "beginner" Перегружаю void paintEvent( QPaintEvent * ), рисую, но не на всем виджете. Хочется, что б место под незарисованной частью было прозрачным. Как это сделать? Код: void <className>::paintEvent( QPaintEvent * ) { Название: Празрачность виджета. Отправлено: beginner от Апреля 04, 2006, 17:11 Цитата: "Dendy" Попробуй прочитать здесь: sorry, 4.1.0http://prog.org.ru/forum/topic_1964_4701b77b1aaa095e419c4215d42ca629.html 2QCasper, не помогло, все рисуется на сером фоне. (Мой виджет является топлевел окном, мож это что-то меняет) Название: Празрачность виджета. Отправлено: Dendy от Апреля 04, 2006, 17:33 Енто всмьІсле дьІрка в топ-левел окне? Тогда только накладьІвая маску на окно.
Название: Празрачность виджета. Отправлено: Asaphus_Expansus от Апреля 04, 2006, 17:56 QWidget::setMask ?
Название: Празрачность виджета. Отправлено: Dendy от Апреля 04, 2006, 18:29 Ну да. Я так понял он хочет прозрачность топ-левел окна, чтобьІ бьІло видно что за ним.
Название: Празрачность виджета. Отправлено: beginner от Апреля 05, 2006, 05:01 Прально понял. То что нужно, вот только не разобрался как просто сделать QRegion из всего того, что рисую на QPainter'e. Щас всё криво - каждый раз, когда что-то рисую добавляю зарисованную область к общему region, а затем setMask(region).
Название: Празрачность виджета. Отправлено: Dendy от Апреля 05, 2006, 11:59 Тебе просто нужно пользоваться не QRegion, а QBitmap. И чтобьІ ентот битмап всегда соответствовал тому, что рисуется в paintEvent().
Как вариант: рисуешь не на QWidget, а на QPixmap с прозрачностью. Примерно так: Код: void W::paintEvent( QPaintEvent * e ) Название: Празрачность виджета. Отправлено: beginner от Апреля 05, 2006, 18:43 Цитата: "Dendy" Примерно так: Код: void W::paintEvent( QPaintEvent * e ) Так не работает - незарисованная область в таком случае отображается черным. Возможно нужно пару свойств QPixmap поменять? Название: Празрачность виджета. Отправлено: Dendy от Апреля 05, 2006, 19:33 Попробуй перед рисованием на пиксмапе сделать:
Код: p.setCompositionMode( QPainter::CompositionMode_Source ); Если не получится рисовать на QPixmap - рисуй на QImage с форматом QImage::Format_ARGB32_Premultiplied. Название: Празрачность виджета. Отправлено: beginner от Апреля 06, 2006, 01:58 Хм, но у QImage нет mask(),
а p.setCompositionMode( QPainter::CompositionMode_Source ) не помогает. Название: Празрачность виджета. Отправлено: Dendy от Апреля 06, 2006, 09:20 Рисуешь на QImage. Ставишь режим рисования QPainter::CompositionMode_Source. Маску налаживать так:
Код: setMask( QPixmap::fromImage( image ).mask() ); Конвертация будет мгновенной. Название: Празрачность виджета. Отправлено: beginner от Апреля 06, 2006, 16:47 Спасибо, так работает, но с QPainter::CompositionMode_Source пропадает возможность использовать попупрозрачные цвета (например color.setAlpha(50), не даёт эффекта). Если без QPainter::CompositionMode_Source, то на незарисованной области появляются всякие глюки, какие-то фрагменты виджета.
Название: Празрачность виджета. Отправлено: Dendy от Апреля 06, 2006, 19:37 Дак, дело в том, что маска может бьІть либо абсолютно прозрачная, либо абсолютно непрозрачная. Полупрозрачного результирующего цвета бьІть не должно. Если тьІ просто собираешься нарисовать полупрозрачньІй елемент, то перед етим меняешь compositionMode.
Название: Празрачность виджета. Отправлено: beginner от Апреля 07, 2006, 02:36 Ясно. Но в варианте, когда я ручками собирал QRegion, в рамках виджета нормально отображается полупрозрачный цвет, а вот если по другому не получается.
|