QSvgGenerator

      Комментарии к записи QSvgGenerator отключены

Помечено: , , ,

В этой теме 1 ответ, 2 участника, последнее обновление  Васильев Владимир Сергеевич 6 мес., 2 нед. назад.

  • Автор
    Сообщения
  • #3992

    NikitaZ
    Участник

    В общем, делаю клиент-серверное приложение с работой со сценой. Клиент открывает сцену, например, создает там квадрат, сохраняет и отсылает полученный файл на сервер. Сервер принимает, открывает сцену и загружает файл. Все прошло хорошо, но есть проблема. В файл не записываются координаты объекта. Посмотрел примеры svg файлов в интернете и выяснил, что есть вот такой тег:

    <circle cx="200px" cy="200px" r="104px" fill="green" transform="translate(-60, 52)" />

    Где по русски написаны координаты, размер, радиус, цвет и смещение круга. Возникает вопрос. Почему клиент не сохраняет координаты объекта?

    Вот так сохраняет клиент.

        QString newPath = QFileDialog::getSaveFileName(this, trUtf8("Save SVG"),
                path, tr("SVG files (*.svg)"));
    
            if (newPath.isEmpty())
                return;
    
            path = newPath;
    
            generator = new QSvgGenerator();        // Создаём объект генератора файла
            generator->setFileName(path);    // Устанавливаем путь к файлу, куда будет сохраняться векторная графика
            generator->setSize(QSize(scene->width(), scene->height()));  // Устанавливаем размеры рабочей области документа в миллиметрах
            generator->setViewBox(QRect(0, 0, scene->width(), scene->height())); // Устанавливаем рабочую область в координатах
            generator->setTitle(trUtf8("SVG Example"));                          // Титульное название документа
            generator->setDescription(trUtf8("File created by SVG Example"));    // Описание документа
    
            // С помощью класса QPainter
            painter = new QPainter();
            painter->begin(generator);  // Устанавливаем устройство/объект в котором будем производить отрисовку
            scene->render(painter);    // Отрисовываем содержимое сцены с помощью painter в целевое устройство/объект
            painter->end();              // Заканчиваем отрисовку

  • #3994

    Вы говорите, что он не записывает в файл координаты объекта, но ведь как-то он этот объект позиционирует? Или файл, который получается на выходе неправильно отображается?

    Я написал следующий пример:
    файл svggenerator.pro:

    QT += core gui svg widgets
    
    TARGET = svggenerator
    TEMPLATE = app
    
    DEFINES += QT_DEPRECATED_WARNINGS
    
    SOURCES += main.cpp

    Файл main.cpp:

    #include <QApplication>
    #include <QtSvg/QSvgGenerator>
    #include <QGraphicsScene>
    #include <QPainter>
    #include <QGraphicsEllipseItem>
    
    int main(int argc, char *argv[]) {
      QApplication a(argc, argv);
      const QString path = "test.svg";
    
      QSvgGenerator generator;
      QGraphicsScene scene;
      QGraphicsEllipseItem circle(30, 20, 40, 50);
      QPainter painter;
    
      scene.addItem(&circle);
      generator.setFileName(path);
      generator.setSize(scene.sceneRect().size().toSize());
    
      painter.begin(&generator);
      scene.render(&painter);
      painter.end();
    
      return a.exec();
    }
    

    Тут на графической сцене, которая рисуется на QSvgGenerator выводится эллипс. В результате работы программы я получаю файл, который прикрепил к сообщению. На файле изображен тот самый эллипс. Теперь я заглядываю внутрь файла (Вы говорите, что там нет координат объекта):

    <?xml version="1.0" encoding="UTF-8" standalone="no"?>
    <svg width="70.5556mm" height="70.5556mm"
     viewBox="0 0 200 200"
     xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"  version="1.2" baseProfile="tiny">
    <title>SVG Generator Example Drawing</title>
    <desc>An SVG drawing created by the SVG Generator Example provided with Qt.</desc>
    <defs>
    </defs>
    <g fill="none" stroke="black" stroke-width="1" fill-rule="evenodd" stroke-linecap="square" stroke-linejoin="bevel" >
    
    <g fill="none" stroke="#000000" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(1,0,0,1,0,0)"
    font-family="DejaVu Sans" font-size="11" font-weight="400" font-style="normal" 
    >
    </g>
    
    <g fill="none" stroke="#000000" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(3.92157,0,0,3.92157,-115.686,-76.4706)"
    font-family="DejaVu Sans" font-size="11" font-weight="400" font-style="normal" 
    >
    <ellipse cx="50" cy="45" rx="20" ry="25"/>
    </g>
    
    <g fill="none" stroke="#000000" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(3.92157,0,0,3.92157,-115.686,-76.4706)"
    font-family="DejaVu Sans" font-size="11" font-weight="400" font-style="normal" 
    >
    </g>
    
    <g fill="none" stroke="#000000" stroke-opacity="1" stroke-width="1" stroke-linecap="square" stroke-linejoin="bevel" transform="matrix(1,0,0,1,0,0)"
    font-family="DejaVu Sans" font-size="11" font-weight="400" font-style="normal" 
    >
    </g>
    </g>
    </svg>

    В этом файле вы можете без труда найти координаты:
    <ellipse cx="50" cy="45" rx="20" ry="25"/>

    Объясните что я делаю не так :).

Для ответа в этой теме необходимо авторизоваться.