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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Празрачность виджета.  (Прочитано 8144 раз)
beginner
Гость
« : Апрель 04, 2006, 03:23 »

Перегружаю void paintEvent( QPaintEvent * ), рисую, но не на всем виджете. Хочется, что б место под незарисованной частью было прозрачным. Как это сделать?
Записан
Dendy
Гость
« Ответ #1 : Апрель 04, 2006, 09:43 »

Попробуй прочитать здесь:

http://prog.org.ru/forum/topic_1964_4701b77b1aaa095e419c4215d42ca629.html
Записан
QCasper
Гость
« Ответ #2 : Апрель 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
Гость
« Ответ #3 : Апрель 04, 2006, 17:11 »

Цитата: "Dendy"
sorry, 4.1.0
2QCasper, не помогло, все рисуется на сером фоне.
(Мой виджет является топлевел окном, мож это что-то меняет)
Записан
Dendy
Гость
« Ответ #4 : Апрель 04, 2006, 17:33 »

Енто всмьІсле дьІрка в топ-левел окне? Тогда только накладьІвая маску на окно.
Записан
Asaphus_Expansus
Гость
« Ответ #5 : Апрель 04, 2006, 17:56 »

QWidget::setMask ?
Записан
Dendy
Гость
« Ответ #6 : Апрель 04, 2006, 18:29 »

Ну да. Я так понял он хочет прозрачность топ-левел окна, чтобьІ бьІло видно что за ним.
Записан
beginner
Гость
« Ответ #7 : Апрель 05, 2006, 05:01 »

Прально понял. То что нужно, вот только не разобрался как просто сделать QRegion из всего того, что рисую на QPainter'e. Щас всё криво - каждый раз, когда что-то рисую добавляю зарисованную область к общему region, а затем setMask(region).
Записан
Dendy
Гость
« Ответ #8 : Апрель 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
Гость
« Ответ #9 : Апрель 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
Гость
« Ответ #10 : Апрель 05, 2006, 19:33 »

Попробуй перед рисованием на пиксмапе сделать:

Код:
p.setCompositionMode( QPainter::CompositionMode_Source );


Если не получится рисовать на QPixmap - рисуй на QImage с форматом QImage::Format_ARGB32_Premultiplied.
Записан
beginner
Гость
« Ответ #11 : Апрель 06, 2006, 01:58 »

Хм, но у QImage нет mask(),
а p.setCompositionMode( QPainter::CompositionMode_Source ) не помогает.
Записан
Dendy
Гость
« Ответ #12 : Апрель 06, 2006, 09:20 »

Рисуешь на QImage. Ставишь режим рисования QPainter::CompositionMode_Source. Маску налаживать так:

Код:
setMask( QPixmap::fromImage( image ).mask() );


Конвертация будет мгновенной.
Записан
beginner
Гость
« Ответ #13 : Апрель 06, 2006, 16:47 »

Спасибо, так работает, но с QPainter::CompositionMode_Source пропадает возможность использовать попупрозрачные цвета (например color.setAlpha(50), не даёт эффекта). Если без QPainter::CompositionMode_Source, то на незарисованной области появляются всякие глюки, какие-то фрагменты виджета.
Записан
Dendy
Гость
« Ответ #14 : Апрель 06, 2006, 19:37 »

Дак, дело в том, что маска может бьІть либо абсолютно прозрачная, либо абсолютно непрозрачная. Полупрозрачного результирующего цвета бьІть не должно. Если тьІ просто собираешься нарисовать полупрозрачньІй елемент, то перед етим меняешь compositionMode.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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