приветствую.
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 минут: или я все-таки что-то пропустил и есть другой способ добиться такого вида окошек (без дырок на кнопке конечно :-):