【QT Graphics/View】简易图元编辑器

目录

一、功能要求

二、演示效果

三、部分代码


一、功能要求

要求编制一个简单的图形编辑的系统,可以添加、修改与删除图形元素,以形成图形画面。具体要求如下:

支持图元为简单的六种图形

【QT Graphics/View】简易图元编辑器_第1张图片

图上的黑点给图元的原点,w为宽度width,h为高度height,r为半径radius,a为字符角度angle。这些为这些图元需要保存的参数,另外,每个图元是否填充,用什么模式填充

1、采用单文档方式,文档中存储图形画面的各个图元数据,视图负责图形的绘制。

2、文档支持图形的序列化(连载),提供新建、打开、保存等操作。

3、视图除了绘制图形,还提供图形交互,能够按住Ctrl键再鼠标左键单击来创建图元鼠标左键双击编辑修改图元属性,鼠标右键双击删除图元。

4、图元创建与修改时的参数由参数对话框来编辑。创建时以鼠标左击时光标的所在位置作为基点来创建图元。

【QT Graphics/View】简易图元编辑器_第2张图片

5、使用图元基础类shape作为所有六个图元类的基类,设计派生各个具体的图形类,要求支持上述功能。

【QT Graphics/View】简易图元编辑器_第3张图片

二、演示效果

主界面:支持新建、打开、保存、退出

【QT Graphics/View】简易图元编辑器_第4张图片

创建图元:Ctrl + 鼠标左键触发弹窗

【QT Graphics/View】简易图元编辑器_第5张图片

修改图元:左键双击图元

【QT Graphics/View】简易图元编辑器_第6张图片

图元显示:支持编辑、移动、放大、缩小

【QT Graphics/View】简易图元编辑器_第7张图片

保存文件: JSON格式存储

【QT Graphics/View】简易图元编辑器_第8张图片

三、部分代码

打开功能:解析JSON数据,根据字段属性创建图元

void MainWindow::on_action_open_triggered()
{
    m_scene->clear();
    QString fileName  =QFileDialog::getOpenFileName(this,"打开文件",QDir::currentPath(), "*.json");
    if(!fileName.isEmpty())
    {
        qDebug() << "打开" << fileName ;
        QFile file(fileName);
        file.open(QIODevice::ReadOnly | QIODevice::Text);
        QString value = file.readAll();
        file.close();

        QJsonParseError parseJsonErr;
        QJsonDocument document = QJsonDocument::fromJson(value.toUtf8(), &parseJsonErr);
        if (! (parseJsonErr.error == QJsonParseError::NoError)) {
            QMessageBox::about(NULL, "提示", "读取文件错误!");
            return;
        }

        QJsonObject jsonObject = document.object();

        // Square字段
        if (jsonObject.contains(QStringLiteral("Square"))) {
            QJsonValue arrayValue = jsonObject.value(QStringLiteral("Square"));
            if (arrayValue.isArray()) {
                QJsonArray array = arrayValue.toArray();
                for (int i = 0; i < array.size(); i++) {
                    QJsonValue nameArray = array.at(i);
                    QJsonObject key = nameArray.toObject();
                    qDebug() << key;
                    qDebug() << "key[x]==" << key["x"].toInt();
                    qDebug() << "key[y]==" << key["y"].toInt();
                    BSquare *m_square = new BSquare(
                                0,
                                0,
                                key["w"].toInt(), BGraphicsItem::ItemType::Square);
                    m_square->setPos(key["x"].toInt(), key["y"].toInt());
                    m_scene->addItem(m_square);
                }
            }
        }

        // Rectangle字段
        if (jsonObject.contains(QStringLiteral("Rectangle"))) {
            QJsonValue arrayValue = jsonObject.value(QStringLiteral("Rectangle"));
            if (arrayValue.isArray()) {
                QJsonArray array = arrayValue.toArray();
                for (int i = 0; i < array.size(); i++) {
                    QJsonValue nameArray = array.at(i);
                    QJsonObject key = nameArray.toObject();
                    qDebug() << key;
                    qDebug() << "key[x]==" << key["x"].toInt();
                    qDebug() << "key[y]==" << key["y"].toInt();

                    BRectangle *m_rectangle = new BRectangle(
                                0,
                                0,
                                key["w"].toInt(),
                                key["h"].toInt(), BGraphicsItem::ItemType::Rectangle);
                    m_rectangle->setPos(key["x"].toInt(), key["y"].toInt());
                    m_scene->addItem(m_rectangle);
                }
            }
        }

        // Circle字段
        if (jsonObject.contains(QStringLiteral("Circle"))) {
            QJsonValue arrayValue = jsonObject.value(QStringLiteral("Circle"));
            if (arrayValue.isArray()) {
                QJsonArray array = arrayValue.toArray();
                for (int i = 0; i < array.size(); i++) {
                    QJsonValue nameArray = array.at(i);
                    QJsonObject key = nameArray.toObject();
                    qDebug() << key;
                    qDebug() << "key[x]==" << key["x"].toInt();
                    qDebug() << "key[y]==" << key["y"].toInt();
                    BCircle *m_circle = new BCircle(
                                0,
                                0,
                                key["r"].toInt(), BGraphicsItem::ItemType::Circle);
                    m_circle->setPos(key["x"].toInt(), key["y"].toInt());
                    m_scene->addItem(m_circle);
                }
            }
        }
    }
}

保存功能:获取Scene上所有的Item,获取不同类型的属性(X、Y、W、H、R等)合成JSON格式数据,写入文件

void MainWindow::on_action_save_triggered()
{
    qDebug() << "保存";
    QJsonObject jsonObject;
    QJsonArray CirclejsonArray;
    QJsonArray RectanglejsonArray;
    QJsonArray SquarejsonArray;
    QList items = m_scene->items();
    foreach (QGraphicsItem *item, items) {
        BGraphicsItem* graphicsItem = static_cast(item);
        BGraphicsItem::ItemType itemType = graphicsItem->getType();
        switch (itemType) {
            case BGraphicsItem::ItemType::Circle: {
                QPointF pos = graphicsItem->pos();
                QRectF  rect= graphicsItem->boundingRect();
                qDebug() << "Circle" << pos << rect;
                QJsonObject CirclejsonObject;
                CirclejsonObject.insert("x", pos.x());
                CirclejsonObject.insert("y", pos.y());
                CirclejsonObject.insert("r", rect.width()/2);
                CirclejsonArray.append(CirclejsonObject);

            } break;
            case BGraphicsItem::ItemType::Rectangle: {
                QPointF pos = graphicsItem->pos();
                QRectF  rect= graphicsItem->boundingRect();
                qDebug() << "Rectangle"<< pos << rect;
                QJsonObject RectanglejsonObject;
                RectanglejsonObject.insert("x", pos.x());
                RectanglejsonObject.insert("y", pos.y());
                RectanglejsonObject.insert("w", rect.width());
                RectanglejsonObject.insert("h", rect.height());
                RectanglejsonArray.append(RectanglejsonObject);

            } break;
            case BGraphicsItem::ItemType::Square: {
                QPointF pos = graphicsItem->pos();
                QRectF  rect= graphicsItem->boundingRect();
                qDebug() << "Square"<< pos << rect;
                QJsonObject SquarejsonObject;
                SquarejsonObject.insert("x", pos.x());
                SquarejsonObject.insert("y", pos.y());
                SquarejsonObject.insert("w", rect.width());
                SquarejsonObject.insert("h", rect.height());
                SquarejsonArray.append(SquarejsonObject);

            } break;
            default: break;
        }
    }

    jsonObject.insert("Circle", CirclejsonArray);
    jsonObject.insert("Rectangle", RectanglejsonArray);
    jsonObject.insert("Square", SquarejsonArray);

    QJsonDocument jsonDoc;
    jsonDoc.setObject(jsonObject);
    QString fileName = QFileDialog::getSaveFileName(this,"另存为 ","xxx.json");
    if(!fileName.isEmpty())
    {
        qDebug() << "另存为" << fileName;
        QFile file(fileName);
        if(!file.exists())
        {
            file.open(QIODevice::WriteOnly);
            file.write(jsonDoc.toJson());
            file.close();
            QMessageBox::information(this,"提示","保存成功");
        }

    }
}

下载地址:DrawFigure2020.zip-C++文档类资源-CSDN下载

IT项目交流群-1群:245022761

IT项目交流群-2群:9462866053

你可能感兴趣的:(QT学习之路,QT,图形编辑)