Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: beginner от Апреля 04, 2006, 03:23



Название: Празрачность виджета.
Отправлено: 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 * ) {

QPainter p(this);
p.setBrush(QColor(0,0,0,0));
p.setPen(QColor(0,0,0,0));
p.drawRect(rect());

// а потом рисуй, что хочешь

}


Название: Празрачность виджета.
Отправлено: beginner от Апреля 04, 2006, 17:11
Цитата: "Dendy"
Попробуй прочитать здесь:

http://prog.org.ru/forum/topic_1964_4701b77b1aaa095e419c4215d42ca629.html
sorry, 4.1.0
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 )
{
  QPixmap px( size() );
  QPainter p( &px );
  // draw some...
  p.end();

  setMask( px.mask() );

  p.begin( this );
  p.drawPixmap( 0, 0, px );
  p.end();
}


Название: Празрачность виджета.
Отправлено: beginner от Апреля 05, 2006, 18:43
Цитата: "Dendy"
Примерно так:

Код:
void W::paintEvent( QPaintEvent * e )
{
  QPixmap px( size() );
  QPainter p( &px );
  // draw some...
  p.end();

  setMask( px.mask() );

  p.begin( this );
  p.drawPixmap( 0, 0, px );
  p.end();
}

Так не работает - незарисованная область в таком случае отображается черным. Возможно нужно пару свойств 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, в рамках виджета нормально отображается полупрозрачный цвет, а вот если по другому не получается.