Russian Qt Forum
Ноябрь 25, 2024, 10:46 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: ARGB  (Прочитано 4985 раз)
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 минут:

 или я все-таки что-то пропустил и есть другой способ добиться такого вида окошек (без дырок на кнопке конечно :-):

Записан
Dendy
Гость
« Ответ #1 : Октябрь 07, 2006, 08:36 »

Я вообще в Линуксе не силён, но вот присмотрелся к коду... Случайно не Visual нужно передавать в конкструктор QApplication, в не указательна него Visual * ?.
Записан
dmiceman
Гость
« Ответ #2 : Октябрь 07, 2006, 09:25 »

да нет, по логике вещей должны передаваться Visual* (это структура) и Colormap (это идентификатор).
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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