Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: swizar от Май 26, 2006, 17:31



Название: [3.3.4]Опять прозрачность
Отправлено: swizar от Май 26, 2006, 17:31
Добрый все день.
Столкнулся с такой проблемой:
Код:

void WGT::drawMe ( QPainter& p )
{
int i;
QRect rect;

QSize ms = cp_pixmap->size();
int x = cm_Pos.x () - cm_Rect.ul.X;
int y = cm_Pos.y () - cm_Rect.ul.Y;

QFont font ("Arial", 14);
font.setBold (true);

if ( p.begin ( cp_pixmap ) )
{
p.setFont (font);
p.drawImage ( 0, 0, *bkg_img,
x,
y,
ms.width (),
ms.height () );

rect.setLeft ( 0 ); rect.setTop ( 0 );
rect.setRight ( size().width () ); rect.setBottom ( size().height () );
p.fillRect ( rect, QBrush ( QColor ( 190, 190, 190 ), Qt::Dense5Pattern ) );
p.setPen ( QPen ( QColor (0, 0, 0), 2 ) );
p.drawRect ( rect );
p.setPen ( QPen ( QColor (100, 100, 100), 1 ) );
for ( i = 0; i < (int) (sizeof (items) / sizeof (LEFT_POP_MENU_ITEM)); i ++ )
{
if ( current_elem == i )
{
p.fillRect ( items [ i ].rect, QBrush ( QColor ( 100, 100, 200 ), Qt::Dense4Pattern ) );
}
if ( items [ i ].on_flag == false )
p.setPen (QPen ( QColor (128, 128, 128), 1 ) );
else p.setPen (QPen ( QColor (0, 0, 0), 1 ) );
p.drawText ( items [ i ].rect, 0, items [ i ].name );
}

p.setPen ( QPen ( QColor (100, 100, 100), 2 ) );
p.drawLine ( items [ 1 ].rect.left(), items [ 1 ].rect.bottom() + 2, items [ 1 ].rect.right (), items [ 1 ].rect.bottom() + 3 );
p.drawLine ( items [ 2 ].rect.left(), items [ 2 ].rect.bottom() + 2, items [ 2 ].rect.right (), items [ 2 ].rect.bottom() + 3 );
p.drawLine ( items [ 4 ].rect.left(), items [ 4 ].rect.bottom() + 2, items [ 4 ].rect.right (), items [ 4 ].rect.bottom() + 3 );
p.drawLine ( items [ 6 ].rect.left(), items [ 6 ].rect.bottom() + 2, items [ 6 ].rect.right (), items [ 6 ].rect.bottom() + 3 );
p.end ();
}

return;
};


Вот такое решение. cp_pixmap определен в конструкторе имеет фиксированный размер. bkg_img указатель на Qimage родительского окна т.е. на фон видгета.
Проблема: в Linux работает так как я ожидал, т.е. имеется прозрачнасть, степень прозрачности зависит соответственно от стиля кисти котой закрашивается весь видгет.
В Windows все закрашено серым с разной интенсивностью. Т.е. Получается что вместо моего фона рисуется стандартный фон видгета.
(да забыл написать в конструктор передается флаг "Qt::WStyle_NoBorder | Qt::WRepaintNoErase | Qt::WNoAutoErase | Qt::WStyle_Customize").
Почему такая хрень получается ?

добавлено спустя 6 часов 42 минуты:

 1. Забыл указать что версия Qt 3.3.4.
Я понимаю что тема не нова, но пожалуйста кто знает дайте ссылку на решение проблемы. Я сегодня потратил все утро на поиски в форуме, но подходящего для себя решения не нашел, в основном было о Qt 4.
А она все-таки достаточно сильно отличается от 3-ки.
И потом в Linux код все-таки работает да и в Windows, копирование фоновой картинки в widget происходит, а потом когда рисуется рект на все изображение кистью Qt::Dense4Pattern происходит стирание фона. Почему? Я пробовал явно выставлять setBackgroundMode для pixmap в транспарент, не помогло....

2. Может кто подскажет в принципе другое решение.
Мне надо сделать прозрачный (затемненный) popupmenu.
Я и Шлее почитал про прозрачность и форум, но что-то не уловил, например как сделать в принципе стандартный QPopupMenu элемент, но с полупрозрачным фоном?