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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Генерация картинки в файл без X-сервера  (Прочитано 9351 раз)
alex12
Гость
« : Апрель 06, 2009, 06:43 »

Нужно написать утилитку коммандной строки, которая создает файл с картинкой.
Если использовать модуль QtGui и создавать QApplication, то все работает на ура.

Предполагается использовать эту утилитку для построения web-интерфейса в связке с php и apache под Linux. И ничего не работает. Похоже возникает ошибка типа "Can not connect to X server".

Вопрос, как быть? Возможно ли такое сделать в пинципе? Можно ли обойтись без X-сервера, но при этом использовать функции рисования по QImage?

Простейший тест:
Код:
#include <QtGui>

int main( int argc, char **argv )
{
  QApplication app( argc, argv );

  QImage image( 300,200, QImage::Format_RGB32 );
  image.fill(0xFFFFFF);
  QPainter painter( &image );
  painter.drawText(100,100,"Hello, world!");
 
  image.save( "test.png", "PNG" );
  return 0;
}
Код:
TEMPLATE = app
CONFIG += console
SOURCES = test.cpp
« Последнее редактирование: Апрель 06, 2009, 07:08 от alex12 » Записан
BRE
Гость
« Ответ #1 : Апрель 06, 2009, 07:43 »

Если использовать модуль QtGui и создавать QApplication, то все работает на ура.
А если заменить QApplication на QCoreApplication?
Записан
spirit
Гость
« Ответ #2 : Апрель 06, 2009, 08:22 »

Если использовать модуль QtGui...
правильно, т.к. этот класс является частью QtGui.
а с использование QCoreApplication ничего не выйдет,
нужно создавать QApplication, т.к. там идет инифиализация необходимых структур,
так что ваш код правильный.
Записан
alex12
Гость
« Ответ #3 : Апрель 06, 2009, 11:24 »

Так есть ли шанс запустить подобный пример на Linux сервере без X-ов?
Записан
spirit
Гость
« Ответ #4 : Апрель 06, 2009, 11:25 »

попробуйте и сообщите нам результат Улыбающийся
Записан
crackedmind
Гость
« Ответ #5 : Апрель 06, 2009, 11:52 »

Код:
int main( int argc, char **argv )
{
  QCoreApplication app( argc, argv );

  QImage image( 300,200, QImage::Format_RGB32 );
  image.fill(0xFFFFFF);
  QPainter painter( &image );
  painter.drawText(100,100,"Hello, world!");
 
  image.save( "test.png", "PNG" );
  return 0;
}
под виндой крэшится... так что думаю не выйдет Улыбающийся может стоит использовать что-то типа imagemagick?
Записан
Sergeich
Гость
« Ответ #6 : Апрель 06, 2009, 12:58 »

Попробуй так:
Код:
#include <QImage>
#include <QPainter>
#include <QApplication>

int main( int argc, char** argv )
{
  QApplication app( argc, argv, false );

  QImage image( 400, 300, QImage::Format_RGB32 );
  QFont font( "Helvetica", 24 );   
  QPainter painter( &image );

  painter.setFont( font );
  painter.setPen( Qt::black );
  painter.fillRect( image.rect(), Qt::white );
  painter.drawText( image.rect(), Qt::AlignCenter, "Hello, world!" );
  image.save( "test.png", "PNG" );

  return 0;
}
Еще глянь сюды и сюды
Записан
alex12
Гость
« Ответ #7 : Апрель 06, 2009, 15:26 »

Попробуй так:
Код:
#include <QImage>
#include <QPainter>
#include <QApplication>
...
QApplication app( argc, argv, false );
...
Еще глянь сюды и сюды

В яблочко! То, что надо. Спасибо. Проверил на Linux сервере. Связка с PHP рабтает. Можно делать динамические картинки для web-интерфейса!

Теперь от тестов к реальной задаче. Все началось с того, что есть программа с активным использованием библиотеки Qwt для построения кучи графиков. Так вот нужно сделать вывод Qwt-графиков в виде картинок. Вот тестовый пример:

Код:
#include <QApplication>
#include <QImage>
#include <QPainter>

#include <qwt_plot.h>
#include <qwt_plot_curve.h>
#include <qwt_plot_grid.h>
#include <qwt_legend.h>

static void output( QwtPlot *plot )
{
  const int width  = 600;
  const int height = 400;

  QImage image( width,height, QImage::Format_RGB32 );
  image.fill(0xFFFFFF);
  QPainter painter( &image );
  plot->print( &painter, QRect(10,10,width-20,height-20) );
  image.save( "test.png", "PNG" );
}

static void setData( QwtPlotCurve *curve )
{
  QVector<double> x,y;
  for(int i=0;i<1000;i++)
  { x << i;
    y << sin((double)i/1000*2*3.1415926);
  }
  curve->setData( x,y );
}

int main( int argc, char **argv )
{
  QApplication app( argc, argv, true );

  QwtPlot plot;

  QwtPlotGrid grid;
  grid.enableXMin(true);
  grid.enableYMin(true);
  grid.setMajPen(QPen(Qt::black, 1, Qt::DotLine));
  grid.setMinPen(QPen(Qt::gray, 1, Qt::DotLine));
  grid.attach( &plot );

  plot.setCanvasBackground(QColor("linen"));
  plot.setAxisScale(QwtPlot::yLeft,-1,1);
  plot.insertLegend(new QwtLegend, QwtPlot::BottomLegend);

  QwtPlotCurve curve;
  curve.setPen(QPen(Qt::darkBlue,2));
  curve.setTitle("sin"); 
  setData( &curve );
  curve.attach( &plot );

  app.processEvents();

  output( &plot );

  return 0;
}
Код:
TEMPLATE = app
CONFIG  += console
SOURCES = test.cpp

win32{
INCLUDEPATH += $$[QT_INSTALL_PREFIX]/include/Qwt
LIBS        += -lqwt5
}
unix{
INCLUDEPATH += /usr/local/qwt/include
LIBS        += -lqwt
}

К сожалению, здесь фокус с QApplication app( argc, argv, false ); не проходит. Он ругается, очивидно, на  QwtPlot plot; следующим образом:
Код:
QWidget: Cannot create a QWidget when no GUI is being used

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

Его можно понять: QwtPlot наследник QWidget'а. Собственно вывод на QImage сделан как вызов plot->print( &painter, QRect(10,10,width-20,height-20) ); и явно свойства QWidget'а не используются.

Может кто знает, как в рамках Qwt сделать вывод без создания наследников QWidget'? В крайнем случае придется делать вывод графиков вручную, а этого не очень хочется...
« Последнее редактирование: Апрель 06, 2009, 15:37 от alex12 » Записан
spirit
Гость
« Ответ #8 : Апрель 06, 2009, 16:42 »

если дружишь с английским, то можешь обратиться к разработчику Qwt на qtcentre.org в разделе "Qwt". зовут его Uwe.
« Последнее редактирование: Апрель 06, 2009, 17:40 от spirit » Записан
Sergeich
Гость
« Ответ #9 : Апрель 06, 2009, 18:18 »

У QwtPlotItem, наследниками к-ого являются QwtPlotCurve и QwtPlotGrid, есть метод void draw (QPainter *painter, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRect &canvasRect) const, попробуй выводить им.
Записан
Sergeich
Гость
« Ответ #10 : Апрель 06, 2009, 23:58 »

Поковырял исходники qwt, и понял, что оно так, к сожалению, не получиться. В QwtPlotCurve::draw, если нет плота вызывается return Грустный Можно, конечно юзать другие методы, но думаю это не выход. Я бы замутил либу на основе QGraphicsScene, попиздив часть кода из qwt. Через QGraphicsScene::render можно рисовать хоть на принтере, хоть в SVG.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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