天天看點

QT簡易圖元編輯器(QGraphicsScene+QGraphicsView+QGraphicsItem)一、功能要求 二、示範效果 三、部分代碼

目錄

一、功能要求

二、示範效果

三、部分代碼

一、功能要求

要求編制一個簡單的圖形編輯的系統,可以添加、修改與删除圖形元素,以形成圖形畫面。具體要求如下:

支援圖元為簡單的六種圖形

QT簡易圖元編輯器(QGraphicsScene+QGraphicsView+QGraphicsItem)一、功能要求 二、示範效果 三、部分代碼

圖上的黑點給圖元的原點,w為寬度width,h為高度height,r為半徑radius,a為字元角度angle。這些為這些圖元需要儲存的參數,另外,每個圖元是否填充,用什麼模式填充

1、采用單文檔方式,文檔中存儲圖形畫面的各個圖中繼資料,視圖負責圖形的繪制。

2、文檔支援圖形的序列化(連載),提供建立、打開、儲存等操作。

3、視圖除了繪制圖形,還提供圖形互動,能夠按住Ctrl鍵再滑鼠左鍵單擊來建立圖元,滑鼠左鍵輕按兩下編輯修改圖元屬性,滑鼠右鍵輕按兩下删除圖元。

4、圖元建立與修改時的參數由參數對話框來編輯。建立時以滑鼠左擊時光标的所在位置作為基點來建立圖元。

QT簡易圖元編輯器(QGraphicsScene+QGraphicsView+QGraphicsItem)一、功能要求 二、示範效果 三、部分代碼

5、使用圖元基礎類shape作為所有六個圖元類的基類,設計派生各個具體的圖形類,要求支援上述功能。

QT簡易圖元編輯器(QGraphicsScene+QGraphicsView+QGraphicsItem)一、功能要求 二、示範效果 三、部分代碼

二、示範效果

主界面:支援建立、打開、儲存、退出

QT簡易圖元編輯器(QGraphicsScene+QGraphicsView+QGraphicsItem)一、功能要求 二、示範效果 三、部分代碼

建立圖元:Ctrl + 滑鼠左鍵觸發彈窗

QT簡易圖元編輯器(QGraphicsScene+QGraphicsView+QGraphicsItem)一、功能要求 二、示範效果 三、部分代碼

修改圖元:左鍵輕按兩下圖元

QT簡易圖元編輯器(QGraphicsScene+QGraphicsView+QGraphicsItem)一、功能要求 二、示範效果 三、部分代碼

圖元顯示:支援編輯、移動、放大、縮小

QT簡易圖元編輯器(QGraphicsScene+QGraphicsView+QGraphicsItem)一、功能要求 二、示範效果 三、部分代碼

儲存檔案: JSON格式存儲

QT簡易圖元編輯器(QGraphicsScene+QGraphicsView+QGraphicsItem)一、功能要求 二、示範效果 三、部分代碼

三、部分代碼

打開功能:解析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<QGraphicsItem *> items = m_scene->items();
    foreach (QGraphicsItem *item, items) {
        BGraphicsItem* graphicsItem = static_cast<BGraphicsItem *>(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,"提示","儲存成功");
        }

    }
}
           

下載下傳位址:https://download.csdn.net/download/qq_40602000/13689100

IT項目交流群-1群:245022761

IT項目交流群-2群:9462866053

繼續閱讀