Название: ARGB
Отправлено: dmiceman от Октябрь 07, 2006, 05:51
приветствую. xorg7.1 qt 4.2 играюсь с ARGB визуалами в сотрудничестве с Qt. код получения соответствующего визуала передрал из konsole. проблема в том что хотя все как бы работает, все такое градиентно-прозрачное, славливаю на консоль вот такую ошибку при наведении мышкой на окошко: X Error: BadMatch (invalid parameter attributes) 8 Extension: 155 (RENDER) Minor opcode: 4 (RenderCreatePicture) Resource id: 0xc1
что я делаю неправильно и куда копать? вторая проблема в том что видгеты Qt получаются немного дырявыми. как будто рисовальщики стилей ленятся выставлять значение альфа-канала. как бы это побороть? код: #include <QApplication> #include <QFont> #include <QPushButton> #include <QWidget> #include <QPainter> #include <QLinearGradient>
#include <X11/Xlib.h> #include <X11/extensions/Xrender.h>
class MyWidget : public QWidget { public: MyWidget(QWidget *parent = 0); void paintEvent(QPaintEvent*); };
void MyWidget::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setBackground( QBrush(qRgba(0, 0, 0, 0))); painter.eraseRect( rect()); QLinearGradient gradient(0, 0, rect().width(), rect().height()); gradient.setSpread(QGradient::PadSpread); QColor g1(255, 255, 255, 255); QColor g2(200, 255, 200, 255); QColor g3(255, 255, 255, 50); gradient.setColorAt(0, g1); gradient.setColorAt(0.5, g2); gradient.setColorAt(1, g3); painter.setBrush(gradient); painter.drawRect(rect()); }
MyWidget::MyWidget(QWidget *parent) : QWidget(parent) { setFixedSize(200, 120); setWindowTitle( "hhh"); setWindowOpacity( 0.99); setAttribute(Qt::WA_PaintOnScreen); setAttribute(Qt::WA_OpaquePaintEvent); QPushButton *quit = new QPushButton(tr("Quit"), this); quit->setGeometry(62, 40, 75, 30); quit->setFont(QFont("Times", 18, QFont::Bold)); connect(quit, SIGNAL(clicked()), qApp, SLOT(quit())); }
int main(int argc, char *argv[]) { char *display = 0;
Display *dpy = XOpenDisplay( display );
int screen = DefaultScreen( dpy ); Colormap colormap = 0; Visual *visual = 0; int event_base, error_base;
if (XRenderQueryExtension( dpy, &event_base, &error_base ) ) { int nvi; XVisualInfo templ; templ.screen = screen; templ.depth = 32; templ.c_class = TrueColor; XVisualInfo *xvi = XGetVisualInfo( dpy, VisualScreenMask | VisualDepthMask | VisualClassMask, &templ, &nvi ); for ( int i = 0; i < nvi; i++ ) { XRenderPictFormat *format = XRenderFindVisualFormat( dpy, xvi[i].visual ); if ( format->type == PictTypeDirect && format->direct.alphaMask ) { visual = xvi[i].visual; colormap = XCreateColormap( dpy, RootWindow( dpy, screen ), visual, AllocNone ); break; } } }
QApplication app(dpy, argc, argv, Qt::HANDLE(visual), Qt::HANDLE(colormap)); MyWidget widget; widget.show(); return app.exec(); }
добавлено спустя 16 часов 56 минут: или я все-таки что-то пропустил и есть другой способ добиться такого вида окошек (без дырок на кнопке конечно :-): (http://img170.imageshack.us/img170/1532/6cropzd8.th.png) (http://img170.imageshack.us/my.php?image=6cropzd8.png)
Название: ARGB
Отправлено: Dendy от Октябрь 07, 2006, 08:36
Я вообще в Линуксе не силён, но вот присмотрелся к коду... Случайно не Visual нужно передавать в конкструктор QApplication, в не указательна него Visual * ?.
Название: ARGB
Отправлено: dmiceman от Октябрь 07, 2006, 09:25
да нет, по логике вещей должны передаваться Visual* (это структура) и Colormap (это идентификатор).
|