如何使用QDomDocument更改svg属性?

时间:2018-06-24 08:40:41

标签: xml qt svg qt5

下面有一个名为t.svg的svg小文件:

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

<svg width="100%" height="100%" version="1.1"
xmlns="http://www.w3.org/2000/svg">

<text id="HW" x="50" y="50" fill="blue" stroke="none" font-family="Microsoft YaHei" font-size="16">10</text>

</svg>

现在,我想在QSvgWidget上显示svg文件,当我单击按钮时,文本“ 10”应更改为“ 60”,但实际上,我尝试了两种方法,但都失败了。 >

下面是整个Qt项目代码。

#ifndef SVG_WIDGET_H
#define SVG_WIDGET_H

#include <QWidget>
#include <QtSvg>
#include <QVBoxLayout>
#include <QPushButton>
#include <QDomDocument>

class SVGWidget : public QWidget
{
    Q_OBJECT

public:
    SVGWidget(QWidget* parent = 0) : QWidget(parent)
    {
        m_btn = new QPushButton("Change");
        connect(m_btn, SIGNAL(clicked(bool)), this, SLOT(change()));

        QFile file(":/t.svg");
        file.open(QFile::ReadOnly | QFile::Text);
        m_domDoc.setContent(&file);
        file.close();

        m_svgWidget = new QSvgWidget;
        m_svgWidget->load(m_domDoc.toByteArray());

        QVBoxLayout* vLayout = new QVBoxLayout(this);
        vLayout->addWidget(m_btn);
        vLayout->addWidget(m_svgWidget);

        this->setFixedSize(800, 480);
    }

    ~SVGWidget()
    {
    }

public slots:
    void change()
    {
        // change the value, I used two ways to try it, but both failed.
        QDomNodeList domNodeList1 = m_domDoc.elementsByTagName("text");

        // way 1
        QDomText domText = domNodeList1.at(0).toText();
        domText.setNodeValue("60");
        qDebug() << "way 1" << domText.nodeValue();

        // way 2
        QDomNode domNode = domNodeList1.at(0);
        domNode.setNodeValue("60");
        qDebug() << "way 2" << domNode.nodeValue();

        // repaint the widget
        m_svgWidget->load(m_domDoc.toByteArray());
    }

private:
    QSvgWidget*   m_svgWidget;
    QPushButton*  m_btn;
    QDomDocument  m_domDoc;
};

#endif // SVG_WIDGET_H

有人可以给我一些建议吗?

1 个答案:

答案 0 :(得分:0)

您必须使用firstChildElement()获取元素,然后获取第一个子元素并将其转换为QDomText并使用setData()进行更改:

#ifndef SVGWIDGET_H
#define SVGWIDGET_H

#include <QDomDocument>
#include <QFile>
#include <QPushButton>
#include <QSvgWidget>
#include <QVBoxLayout>
#include <QWidget>

class SVGWidget : public QWidget
{
    Q_OBJECT

public:
    SVGWidget(QWidget *parent = 0)
        : QWidget(parent)
    {
        QVBoxLayout* vLayout = new QVBoxLayout(this);
        setFixedSize(800, 480);
        vLayout->addWidget(&m_btn);
        vLayout->addWidget(&m_svgWidget);
        connect(&m_btn, &QPushButton::clicked, this, &SVGWidget::change);

        QFile file(":/t.svg");
        file.open(QFile::ReadOnly | QFile::Text);
        m_domDoc.setContent(&file);
        file.close();
        m_svgWidget.load(m_domDoc.toByteArray());
    }

    ~SVGWidget(){}

public slots:
    void change(){
        QDomElement elementText = m_domDoc.documentElement().firstChildElement("text");
        elementText.firstChild().toText().setData("60");
        m_svgWidget.load(m_domDoc.toByteArray());
    }
private:
    QSvgWidget   m_svgWidget;
    QPushButton  m_btn;
    QDomDocument  m_domDoc;
};

#endif // SVGWIDGET_H