Qt小例子学习75 - 把QGraphicsItem 保存到文本然后读出来显示

这个例子展示了如何使用QDataStream将QGraphicsItem对象保存到文本文件,并之后读取回显到QGraphicsScene中。程序创建了椭圆、线、矩形、路径和图片等图形元素,设置了它们的属性,然后在4秒后写入文件,清除场景。再过1秒,从文件读取并重新添加到场景中。
摘要由CSDN通过智能技术生成

Qt小例子学习75 - 把QGraphicsItem 保存到文本然后读出来显示

#include "utils.h"

#include <QApplication>
#include <QDebug>
#include <QFile>
#include <QGraphicsLineItem>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QTimer>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QGraphicsView view(new QGraphicsScene);

    QGraphicsEllipseItem *eitem = view.scene()->addEllipse(
                                      QRect(10, 10, 80, 50), QPen(Qt::green), QBrush(Qt::black));
    eitem->setPos(100, 10);
    eitem->setRotation(60);

    QGraphicsLineItem *litem =
        view.scene()->addLine(QLineF(0, 0, 100, 100), QPen(Qt::red));
    litem->setPos(10, 10);
    litem->setRotation(100);

    QGraphicsRectItem *ritem = view.scene()->addRect(
                                   QRect(10, 0, 100, 100), QPen(Qt::blue), QBrush(Qt::red));
    ritem->setPos(10, 100);
    ritem->setRotation(10);

    QPainterPath path;
    path.moveTo(100, 100);
    path.lineTo(10, 0);
    path.addRect(QRect(0, 0, 100, 22));
    QGraphicsPathItem *pitem =
        view.scene()->addPath(path, QPen(Qt::green), QBrush(Qt::black));
    pitem->setPos(100, 22);
    pitem->setRotation(120);

    QGraphicsPixmapItem *pixmapitem = new QGraphicsPixmapItem;
    pixmapitem->setPixmap(QPixmap(":/image.png"));
    view.scene()->addItem(pixmapitem);

    QGraphicsItem::GraphicsItemFlags flags =
        QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable |
        QGraphicsItem::ItemIsFocusable | QGraphicsItem::ItemClipsToShape |
        QGraphicsItem::ItemClipsChildrenToShape;

    for (QGraphicsItem *it : view.scene()->items())
    {
        it->setFlags(flags);
    }

    QTimer::singleShot(4000, [&view]()
    {
        qDebug() << "writing ...";
        QFile fileOut("file.txt");
        if (fileOut.open(QIODevice::WriteOnly))
        {
            QDataStream out(&fileOut);
            saveItems(view.scene()->items(), out);
            fileOut.close();
            qDebug() << "clear items";
            view.scene()->clear();
        }
    });

    QTimer::singleShot(5000, [&view]()
    {
        qDebug() << "reading ...";
        QFile fileIn("file.txt");
        if (fileIn.open(QIODevice::ReadOnly))
        {
            QDataStream in(&fileIn);
            QList<QGraphicsItem *> items = readItems(in);
            for (QGraphicsItem *item : items)
            {
                view.scene()->addItem(item);
            }
        }
    });

    view.show();
    return a.exec();
}

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值