решение найдено - но не совсем то что хотелось бы:
C++ (Qt)
void testMask::paintMasked( QPainter* p )
{
if( p )
{
p->fillRect( rect(), Qt::transparent );
p->setCompositionMode(QPainter::CompositionMode_Source);
p->drawPixmap( QPointF(), m_mask );
p->setCompositionMode(QPainter::CompositionMode_SourceIn);
p->drawPixmap(0,0,m_image);
}
}
если сначала отрисовать всё в QPixmap а затем вывести на виджет в paintEvent то всё ок:
C++ (Qt)
void testMask::paintEvent( QPaintEvent* pE )//v1
{
QDialog::paintEvent( pE );
// QPainter p( this );
// paintMasked( &p );
QPixmap px( size() );
px.fill( Qt::transparent );
QPainter p( &px );
paintMasked( &p );
p.end();
p.begin( this );
p.drawPixmap( QPoint(), px );
p.end();
}
[скриншот -
http://www35.zippyshare.com/v/78683668/file.html]
а вот когда рисуешь непосредственно на виджете, то получаем чёрную область на месте предполагаемой прозрачности:
C++ (Qt)
void testMask::paintEvent( QPaintEvent* pE )//v2
{
QDialog::paintEvent( pE );
QPainter p( this );
//p.setBackground( Qt::transparent );
paintMasked( &p );
// QPixmap px( size() );
// px.fill( Qt::transparent );
//
// QPainter p( &px );
//
// paintMasked( &p );
// p.end();
//
// p.begin( this );
// p.drawPixmap( QPoint(), px );
// p.end();
}
[скриншот -
http://www35.zippyshare.com/v/32651042/file.html]
аналогичную чёрную область можно получить и при отрисовке в темповый pixmap (v1), если выставить виджету аттрибут:
C++ (Qt)
setAttribute( Qt::WA_NoSystemBackground );
похожая проблема описана вот здесь:
http://www.qtcentre.org/threads/43614-transparency-problem.-pls-help.
там челу посоветовали юзать темповый pixmap, данный вариант не подходит мне по производительности и использованию памяти, может есть какая-то возможность настроить QPainter так что-бы при отрисовке на виджете результат был аналогичен тому что и при отрисовке в QPixmap (хотя по логике вещей он и должен быть таковым)?