Добрый день. Помогите пожалуйста. Есть виджет (qwtPlot) который надо отрисовывать в QPixmap используя QGraphicsView. Для отрисовки использую такой код:
QGraphicsScene *scene = new QGraphicsScene(0, 0, qwtPlot->width(), qwtPlot->height());
QGraphicsProxyWidget *widget = scene->addWidget(qwtPlot, Qt::Widget);
QGraphicsView *view = new QGraphicsView();
view->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
view->setScene(scene);
qwtPlot->show();
view->show();
QPixmap pixmap(qwtPlot->size());
if (widget->isVisible())
{
QPainter painter(&pixmap);
painter.setRenderHint(QPainter::Antialiasing);
painter.begin(&pixmap);
view->render(&painter);
painter.end();
if (pixmap.save(QApplication::applicationDirPath() + "/image.png", "PNG"))
{
QMessageBox box;
box.setText("Saved");
box.exec();
}
}
delete widget;
delete scene;
delete view;
попробуй убрать
painter.begin(&pixmap);
либо же не указывай в конструкторе адрес девайса (там begin вызовется)
вызов end тоже можно оставить на совесть деструктора:
{
...
{//ВАЖНО!!! Эти фигурные скобки должны тут быть
QPainter painter(&pixmap);
painter.setRenderHint(QPainter::Antialiasing);
view->render(&painter);
}//ВАЖНО!!! Эти фигурные скобки должны тут быть
...
}
Ни каких изменений - опять абсолютно черный файл.
хорошо. Делаем чистый эксперимент:
{
...
{
QPainter painter(&pixmap);
painter.fillRect (0,0,10,20,QColor(0,255,0));
}
...
}
Есть.
giker, значит что ? По умолчанию девайс залит чёрным цветом. Поэтому не видно, что ты на нём нарисовал чёрными линиями/буквами
Хорошо, тогда по идее, если сначала залить весь pixmap белым цветом, а потом отрисовать виджет, то мы должны его увидеть:
{
QPainter painter(&pixmap);
painter.setRenderHint(QPainter::Antialiasing);
painter.fillRect (0, 0, qwtPlot->width(), qwtPlot->height(), QColor(Qt::white));
view->render(&painter);
}
giker, значит, view->render не изменяет картинку, правильно. Почему - я не знаю Покажи рисовалку вьюхи
В смысле рисовалку? qwtPlot это виджет типа QwtPlot из билиотеки Qwt, существующий и уже отображенный на основной форме приложения, на его месте может быть любой контрол расположенный на форме. Кстати заметил, что если я создаю кнопку в коде (то есть ее нет на форме), то она замечательно отрисовывается в файле:
QGraphicsScene *scene = new QGraphicsScene();
//QGraphicsProxyWidget *widget = scene->addWidget(qwtPlot);
QPushButton * button = new QPushButton("", 0);
QGraphicsProxyWidget *widget = scene->addWidget(button);
QGraphicsView *view = new QGraphicsView();
view->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
view->setScene(scene);
qwtPlot->show();
QPixmap pixmap(qwtPlot->size());
if (qwtPlot->isVisible())
{
{
QPainter painter(&pixmap);
painter.setRenderHint(QPainter::Antialiasing);
view->render(&painter);
}
if (pixmap.save(QApplication::applicationDirPath() + "/image.png", "PNG"))
{
QMessageBox box;
box.setText("Saved");
box.exec();
}
}
delete widget;
delete scene;
delete view;
delete button;
giker, я не знаю, с чем это связано. Может быть, размер у вьюхи нулевой ? Попробуй принудительно размер задать какой-нибудь
Итак после долгих экспериментов, задача почти решилась - фаил заполняет нечто, код вот такой:
QGraphicsScene *scene = new QGraphicsScene(0, 0, qwtPlot->width(), qwtPlot->height());
QGraphicsProxyWidget *widget = scene->addWidget(qwtPlot);
QPixmap pixmap(300, 300);
QPainter painter(&pixmap);
painter.setRenderHint(QPainter::Antialiasing);
QGraphicsView *view = new QGraphicsView();
view->setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
qwtPlot->repaint();
view->render(&painter, QRectF(), QRect(), Qt::IgnoreAspectRatio);
pixmap.save(QApplication::applicationDirPath() + "/image.png", "PNG"))
я так понимаю, что продвижение - это
QPixmap pixmap(300, 300);
?
я домой приду, попробую. Это через 3-4 часика
Задача так и не решилась - то что я принял за неправильное отображение моего рисунка, оказалось просто мусором при создания pixmap (кстати странно что он не создается просто черным, в каким-то серобурмальновым в полоску). Интересует вот какой вопрос: Возможно ли в принципе отрисовать в файл через QGraphicScene, виджет уже отрисованный на форме или нет?
Решил пойти другим путем: QwtPlot умеет сохранять свои графики в svg формат через QSvgGenerator, мне нужно вставить этот SVG-рисунок в HTML для последующей конвертации его в PDF. В связи с этим возникает вопрос: где хранятся данные svg-картинки в QsvgGenerator. Или нужно сохранить ее файл, а потом вставлять его в HTML? Если да то как: текстом или массивом данных из прочитанного файла?
блин, я и забыл совсем покопаться, из головы вылетело ((
giker, напомни мне вечером, что ли...
Не подходит потому что зависит от текущего состояния - размера виджета. Например если пользователь изменит размер родительского окна, соответственно изменяться размеры и дочерних виджетов. Мне же нужно отрисовывать виджет в картинку заданных размеров, желательно с таким же качеством как на экране.
giker, а ты палитру, кстати, делаешь такую же, как у того, кто рендерит ?
Палитру вообще не выставляю. Где, как и у кого она выставляется?
хм, а фиг знает. Я нашёл только как прочитать битность и количество цветов - depth() и colorCount ()
кстати, не игнорируй вот это замечание
Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)