c++ - GraphicsView 中的文本

标签 c++ qt

我在 Qt 中的图形场景中添加了文本项,方法是为其分配 id,但我无法保存这些项;我正在使用 XmlstreamWriter。

以下是我添加文本的代码片段:

cadtextitem.h

#ifndef cadtextitem_H
#define cadtextitem_H

#include <QGraphicsTextItem>
#include <QPen>

QT_BEGIN_NAMESPACE
class QFocusEvent;
class QGraphicsItem;
class QGraphicsScene;
class QGraphicsSceneMouseEvent;
QT_END_NAMESPACE

class cadtextitem:public QGraphicsTextItem
{
    Q_OBJECT
public:
    enum { Type = UserType + 3 };
    cadtextitem( int, QGraphicsItem *parent=0);
    int type() const{return Type;}
    int id;
signals:
    void lostFocus(cadtextitem *item);
    void selectedChange(QGraphicsItem *item);

protected:
    QVariant itemChange(GraphicsItemChange change, const QVariant &value);
    void focusOutEvent(QFocusEvent *event);
    void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);
};

#endif // cadtextitem_H

cadtextitem.cpp

 #include "cadtextitem.h"

        cadtextitem::cadtextitem(int i, QGraphicsItem *parent)
            : QGraphicsTextItem(parent)
        {
            //assigns id
            id = i;

        }

        QVariant cadtextitem::itemChange(GraphicsItemChange change,
                                         const QVariant &value)
        {
            if (change == QGraphicsItem::ItemSelectedHasChanged)
                emit selectedChange(this);
            return value;
        }

        void cadtextitem::focusOutEvent(QFocusEvent *event)
        {
            setTextInteractionFlags(Qt::NoTextInteraction);
            emit lostFocus(this);
            QGraphicsTextItem::focusOutEvent(event);
        }

        void cadtextitem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
        {
            if (textInteractionFlags() == Qt::NoTextInteraction)
                setTextInteractionFlags(Qt::TextEditorInteraction);
            QGraphicsTextItem::mouseDoubleClickEvent(event);
        }

以下是保存项目的代码:

主窗口.cpp

void MainWindow::on_actionSave_triggered()
{
    // save file dialog box
    QString filename = QFileDialog::getSaveFileName(this,
                                                  tr("Save File"),
                                                  QString(),
                                                  tr("file Name(*.xml)"));
    if(!filename.isEmpty())
    {
        QFile file(filename);
        if (!file.open(QIODevice::WriteOnly))
        {
            QMessageBox::critical(this, tr("Error"), tr("Could not open file"));
            return;
        }
        else
        {
            QXmlStreamWriter xmlWriter(&file);
            xmlWriter.setAutoFormatting(true);
            xmlWriter.writeStartDocument();
            xmlWriter.writeStartElement("SceneData");
            xmlWriter.writeAttribute("version", "v1.0");
            xmlWriter.writeStartElement("Entities");

            view->scene->writeStream(&xmlWriter);

            xmlWriter.writeEndElement();   //end of Entities
            xmlWriter.writeEndElement();   //end of SceneData
            QMessageBox::warning(this, "Saved",
                                 QString("Saved Scene Data to '%1'").
                                 arg(filename));
            file.close();
        }
    }

cadgraphicsscene.cpp

void CadGraphicsScene::writeStream(QXmlStreamWriter *stream)
{
    // write entities in a file
    foreach (QGraphicsItem *item, itemList)
    {
        if (items().contains(item))
        {
            if (item->type() == Point::Type)
            {
                Point *myItem = dynamic_cast<Point *>(item);
                stream->writeStartElement("Point");
                stream->writeAttribute("id", QString::number(myItem->id));
                stream->writeAttribute("x", QString::number(myItem->x()));
                stream->writeAttribute("y", QString::number(myItem->y()));
                stream->writeEndElement();  //end of Point Item
            }

            else if (item->type() == Line::Type)
            {
                Line *myItem = dynamic_cast<Line *>(item);
                stream->writeStartElement("Line");
                stream->writeAttribute("id", QString::number(myItem->id));
                stream->writeAttribute("x1", QString::number(myItem->start_p.x()));
                stream->writeAttribute("y1", QString::number(myItem->start_p.y()));
                stream->writeAttribute("x2", QString::number(myItem->end_p.x()));
                stream->writeAttribute("y2", QString::number(myItem->end_p.y()));
                stream->writeEndElement();  //end of Line Item
            }

            else if (item->type() == Circle::Type)
            {
                Circle *myItem = dynamic_cast<Circle *>(item);
                stream->writeStartElement("Circle");
                stream->writeAttribute("id", QString::number(myItem->id));
                stream->writeAttribute("cx", QString::number(myItem->center_p.x()));
                stream->writeAttribute("cy", QString::number(myItem->center_p.y()));
                stream->writeAttribute("radius", QString::number(myItem->radius));
                stream->writeEndElement();  //end of Circle Item
            }

            else if (item->type() == Ellipse::Type)
            {
                Ellipse *myItem = dynamic_cast<Ellipse *>(item);
                stream->writeStartElement("Ellipse");
                stream->writeAttribute("id", QString::number(myItem->id));
                stream->writeAttribute("cx", QString::number(myItem->p1.x()));
                stream->writeAttribute("cy", QString::number(myItem->p1.y()));
                stream->writeAttribute("majR", QString::number(myItem->majRadius));
                stream->writeAttribute("minR", QString::number(myItem->minRadius));
                stream->writeEndElement();  //end of Ellipse Item
            }


            else if (item->type() == mText::Type)
            {
                mText *myItem = dynamic_cast<mText *>(item);
                stream->writeStartElement("Ellipse");
                stream->writeAttribute("id", QString::number(myItem->id));
                stream->writeAttribute("textwidth", QString::number(myItem->textWidth()));
                stream->writeEndElement();  //end of Text Item
            }
        }
    }
}

最佳答案

从您发布的代码来看,您缺少对流作者的 writeEndDocument 的调用功能。

关于c++ - GraphicsView 中的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26385364/

相关文章:

c++ - 带有 bool 参数的构造函数总是使用 _T ("..."调用)?

c++ - QtQuick ChartView QML 对象段错误在加载期间导致 QML 引擎段错误

c++ - 如何在原生 C/C++ 中使用 Qt 绘制二维码

c++ - 指针算术变化取决于输出?

c++ - 实例化部分模板规范的别名时隐式实例化未定义模板

c++ - 将 double 值舍入为(稍微)较低精度的好方法是什么?

c++ - QT线程中的Lua脚本

c++ - 如何调试 QXmlSchema 的加载方法?

c++ - QGLShaderProgram::setAttributeArray(0, ...) 与 QGLShaderProgram::setAttributeArray ("position", ...)

c++ - Clang 格式并不总是遵守 BinPackParameters : false