Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: ltise от Октябрь 01, 2010, 01:53



Название: Загрузка стиля с последующей отрисовкой в QPixmap
Отправлено: ltise от Октябрь 01, 2010, 01:53
Всем привет! подскажите плиз как лучше решить задачу:

есть куча разных виджетов, вид которых определен файлом css.
задача в том, чтобы отрисовывать эти виджеты (или стили) через QPainter...
одним словом - есть один виджет, в него надо отрисовывать объекты, внешний вид некоторых задан в css. добавлять виджеты в качестве потомков нельзя...
пробую сделать следующим образом:

CSS:
Код:
QWidget#point3984{
background-color: rgba(0,0,222, 180);
border-color: red;
border-width: 2px;
max-width: 8;
max-height: 8;
}
Код:
class MyClass
{
....
static QWidget * _csstyle=0;
...
void init()
{
...
if (_csstyle == 0){
_csstyle = new QWidget();
_csstyle->setObjectName("point3984");
}
}
...
...
void paint(QPainter painter)
{

QPixmap pixmap(_csstyle->size());
pixmap.grabWidget(_csstyle);

painter->drawPixmap(_position, pixmap);
qDebug() << _csstyle.size(); // 8x8 - ok
...
...
}

}

Не работает! т.е. стиль вроде-бы считывает, но рисуется как то по левому, цвета какие-то не те..

В чем может быть загвоздка ?
Как сделать правильно ?

В аттаче пример - вообще ничего не грабится, черный квадрат  ???

Спасибо


Название: Re: Загрузка стиля с последующей отрисовкой в QPixmap
Отправлено: kdm от Октябрь 02, 2010, 21:20
grabWidget - статический метод и возвращает QPixmap. Так, например, и со scaled. Я тоже столкнулся с проблеммой, мне объяснили.

Код:
void MainWindow::_timeout()
{
        *pixmap = QPixmap::grabWidget(this);
pixmap->save("d:/aa.bmp");
update();
}
Как сделать лучше, не знаю.

Или
Код:
void MainWindow::_timeout()
{
        QPixmap::grabWidget(this).save("d:/aa.bmp");
        update();
}

А что за фишка с таймером?:)


Название: Re: Загрузка стиля с последующей отрисовкой в QPixmap
Отправлено: ltise от Октябрь 02, 2010, 21:48
А что за фишка с таймером?:)

Да это я тупил - может граб нужно вызывать после прорисовки виджета.. кнопку лепить лень было - повесил на таймер :)
спасибо за ответ.. совсем не очевидная фигня, я выкрутился используя
Код:
	QPainter painter(pixmap);
widget.render(&painter, QPoint(0,0), widget.visibleRegion(),  QWidget::DrawChildren);