Qt QGraphicsSvgItem 缩放和调整大小

Posted

技术标签:

【中文标题】Qt QGraphicsSvgItem 缩放和调整大小【英文标题】:Qt QGraphicsSvgItem scaleing and resizeing 【发布时间】:2016-05-09 11:18:01 【问题描述】:

我在QGraphicsSvgItem 之后创建了类继承并将其命名为MyObject。我希望为其分配一个图标,但同时我希望能够重新调整它,以便我可以使用一个图标来呈现不同的对象(例如,Door-Icon.svg 用于呈现小门和大门)。现在它有一个问题 - 没有选项可以从 *.svg 本身重新缩放图像。我尝试使用QPixmap,但它给了我像素化的图像。

  class MyObject : public QGraphicsSvgItem
  
      void assign_Icon(QString Path);
      void rescale_Icon(QString Path);
      int Widith;
      int Height;
        // ...
  

和功能:

  void MyObject::assign_Icon(QString Path)
  
      QSvgRenderer *renderer = new QSvgRenderer(Path);
      this->setSharedRenderer(renderer);
      Widith =  this->renderer()->defaultSize().width();
      Height =  this->renderer()->defaultSize().height();
  

仅以基本尺寸呈现*.svg 效果很好,但我无法找到“如何”将*.svg 图标调整为对象当前宽度和高度。

  void MyObject::rescale_Icon(QString Path)
  
      QSvgRenderer *renderer = new QSvgRenderer(Path);
      this->setSharedRenderer(renderer);
      // But what to do here?
  

【问题讨论】:

【参考方案1】:

通过以下方式解决:

    QRectF MyObject::boundingRect() const
    
        return QRectF(0,0,Widith,Height);
    

    void MyObject::paint(QPainter *painter, const QStyleOptionGraphicsItem *options, QWidget *widget)
    
        this->renderer()->render(painter, boundingRect());
    

【讨论】:

【参考方案2】:
void GraphicsColorSvgItem::paint(QPainter* painter,
                             const QStyleOptionGraphicsItem*option,
                             QWidget *widget)

    Q_UNUSED(option);
    Q_UNUSED(widget);

    _renderer.load(initFileSvg().toUtf8());

    painter->setRenderHint(QPainter::Antialiasing, true);
    painter->fillPath(shape(), Qt::NoBrush);

    //Start draw SVG file and set Rect
    _renderer.render(painter,QRect(0,
                               0,
                               getItemSize().width(),
                               getItemSize().height()));
    _fileSvg.close();
    painter->setRenderHint(QPainter::Antialiasing, false);

QString GraphicsColorSvgItem::initFileSvg()

    _fileSvg.setFileName(getFileName());
    _fileSvg.open(QIODevice::ReadOnly | QIODevice::Text);
    _str.setDevice(&_fileSvg);
    _content = _str.readAll();

    return _content;

创建对象这个类 GraphicsColorSvgItem itemSVG = new GraphicsColorSvgItem; 并满足规模需求: itemSVG->setScale(scale_value);

【讨论】:

以上是关于Qt QGraphicsSvgItem 缩放和调整大小的主要内容,如果未能解决你的问题,请参考以下文章

win10qt软件控件大小

PyQt4:QPainter 和 QGraphicsSvgItem

Qt / PyQt 绘制网格背景源码

Qt / PyQt 绘制网格背景源码

Qt - 如何将 QGraphicsScene 缩放到 QGraphicsView

Qt / PyQt 绘制网格背景源码