目录
一、功能要求
二、演示效果
三、部分代码
要求编制一个简单的图形编辑的系统,可以添加、修改与删除图形元素,以形成图形画面。具体要求如下:
支持图元为简单的六种图形
图上的黑点给图元的原点,w为宽度width,h为高度height,r为半径radius,a为字符角度angle。这些为这些图元需要保存的参数,另外,每个图元是否填充,用什么模式填充
1、采用单文档方式,文档中存储图形画面的各个图元数据,视图负责图形的绘制。
2、文档支持图形的序列化(连载),提供新建、打开、保存等操作。
3、视图除了绘制图形,还提供图形交互,能够按住Ctrl键再鼠标左键单击来创建图元,鼠标左键双击编辑修改图元属性,鼠标右键双击删除图元。
4、图元创建与修改时的参数由参数对话框来编辑。创建时以鼠标左击时光标的所在位置作为基点来创建图元。
5、使用图元基础类shape作为所有六个图元类的基类,设计派生各个具体的图形类,要求支持上述功能。
主界面:支持新建、打开、保存、退出
创建图元:Ctrl + 鼠标左键触发弹窗
修改图元:左键双击图元
图元显示:支持编辑、移动、放大、缩小
保存文件: JSON格式存储
打开功能:解析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