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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Выгрузка графиков QWT в файл  (Прочитано 8188 раз)
Irina
Гость
« : Июнь 29, 2017, 12:16 »

Добрый день, уважаемые!
Задача: выгрузить график в изображение с сохранением всех цветов. Сами линии на графике выгружаются цветные, а вот шкала Y с подписью графика теряет цвет, становится просто белой. На картинке все три шкалы должны быть своего цвета, а, как видите, они просто прозрачные.
Вот код:
Код:
QwtPlotRenderer renderer;
renderer.setDiscardFlag(QwtPlotRenderer::DiscardBackground);
renderer.setDiscardFlag(QwtPlotRenderer::DiscardLegend);
qreal widthMm = printer->pageRect(QPrinter::Millimeter).width();
qreal heightMm = printer->pageRect(QPrinter::Millimeter).height();
qint16 widthPx = widthMm / 0.2646;
qint16 heightPx = heightMm / 0.2646;
QSizeF size(widthMm, heightMm);
renderer.renderDocument(_currentChart->getChartPlot(), imagePlotPath, size, ui->spinBoxImageResolution->value());
Насколько я поняла, флагов для сохранения цветности нет. Как мне добиться этого? Выручайте.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Июнь 29, 2017, 13:29 »

через QPixmap::grabWidget стоит попробовать.
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #2 : Июнь 29, 2017, 13:30 »

Код
C++ (Qt)
   QImage im(widthPx, heightPx, QImage::Format_RGB32);
   im.fill(Qt::lightGray);
   renderer.renderTo(w.plot_, im);
   im.save("C:/temp/image2.png");
 
Записан
Irina
Гость
« Ответ #3 : Июнь 30, 2017, 07:28 »

через QPixmap::grabWidget стоит попробовать.
Пробовала, но это не подходит: вытаскивает картинку в таком виде, в каком виджет в момент граба и находится. А мне нужно подгонять размеры под размер бумаги.
Записан
Irina
Гость
« Ответ #4 : Июнь 30, 2017, 07:29 »

Код
C++ (Qt)
   QImage im(widthPx, heightPx, QImage::Format_RGB32);
   im.fill(Qt::lightGray);
   renderer.renderTo(w.plot_, im);
   im.save("C:/temp/image2.png");
 
Это же просто идёт заливка цветом прозрачных мест, а шкалы разноцветные и имеют тот цвет, что и кривые на графике.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #5 : Июнь 30, 2017, 09:57 »

Я не совсем понял про цвет шкалы. Можно принтскрин?
Записан
Irina
Гость
« Ответ #6 : Июнь 30, 2017, 10:04 »

Я не совсем понял про цвет шкалы. Можно принтскрин?
Смотрите, это график в том виде, в каком он на форме. Два цвета линий и такого же цвета шкала. Цвет линий сохраняется, а цвет шкал - нет. Я бы и использовала grabWidget, но размеры... мне нужно подгонять под размеры бумаги, с учётом, что на листе ещё есть небольшая таблица в верхней части, поэтому и очень важны размеры. Поэтому QwtPlotRenderer - идеальное решение, но отбрасывается расцветка шкалы.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #7 : Июнь 30, 2017, 11:19 »

Можно попробовать переопределить метод QwtPlotRenderer::renderScale. При отрисовке графика этот метод дёргается для каждой оси.
Записан
Irina
Гость
« Ответ #8 : Июнь 30, 2017, 11:26 »

Можно попробовать переопределить метод QwtPlotRenderer::renderScale. При отрисовке графика этот метод дёргается для каждой оси.

Можно подробней, пожалуйста? А то у меня дела с Qwt идут очень тяжело, скудная документация просто поражает.
Записан
Irina
Гость
« Ответ #9 : Июль 03, 2017, 07:09 »

Можно попробовать переопределить метод QwtPlotRenderer::renderScale. При отрисовке графика этот метод дёргается для каждой оси.

Что писать в теле метода? Хотя бы на словах расскажите, пожалуйста.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #10 : Июль 03, 2017, 07:43 »

 рисовать фон в предоставленном прямоугольнике, затем вызывать метод renderScale базового класса, чтобы тот уже нарисовал шкалу. Вроде так.
Хотел бы поинтересоваться, как на виджет задается градиент? Средствами qwt?
Записан
Irina
Гость
« Ответ #11 : Июль 03, 2017, 08:01 »

Весь проект достался мне в наследство, так сказать. Градиент я не делала сама, делюсь кодом. Вроде, то.
Код:
QPalette palette = scaleWidget->palette();
int width = scaleWidget->width();
int height = scaleWidget->height();
QLinearGradient linearGradient(QPointF(0, 0), QPointF(width, height));
linearGradient.setColorAt(0.0, _chartPlot->canvasBackground().color());
linearGradient.setColorAt(0.9, color.lighter());
linearGradient.setColorAt(1.0, color);
QBrush brush(linearGradient);
palette.setBrush(QPalette::Background, linearGradient);
scaleWidget->setPalette(palette);

Подскажите, пожалуйста. В методе QwtPlotRenderer::renderScale(const QwtPlot * plot, QPainter * painter, int axisId, int startDist, int endDist, int baseDist, const QRectF & rect) параметры
startDist - начальное значение шкалы
endDist - конечное значение шкалы
но не понимаю что значат и как определить baseDist и rect.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #12 : Июль 03, 2017, 09:22 »

Подскажите, пожалуйста. В методе QwtPlotRenderer::renderScale(const QwtPlot * plot, QPainter * painter, int axisId, int startDist, int endDist, int baseDist, const QRectF & rect) параметры
startDist - начальное значение шкалы
endDist - конечное значение шкалы
но не понимаю что значат и как определить baseDist и rect.
start и end Dist - это отступы судя по всему от начала данного прямоугольника
Код
C++ (Qt)
void QwtPlotRenderer::renderScale( const QwtPlot *plot,
   QPainter *painter,
   int axisId, int startDist, int endDist, int baseDist,
   const QRectF &rect ) const
{
   //...
   double x, y, w;
 
   switch ( axisId )
   {
       case QwtPlot::yLeft:
       {
           x = rect.right() - 1.0 - baseDist;
           y = rect.y() + startDist;
           w = rect.height() - startDist - endDist;
           align = QwtScaleDraw::LeftScale;
           break;
       }
baseDist, наверное, это отступы в поперечном направлении (для оси x по y, а для оси y по x)
rect, как я понимаю и есть размеры холста, на котором происходит рисование с помощью painter.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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