目錄
一、功能要求
二、示範效果
三、部分代碼
一、功能要求
要求編制一個簡單的圖形編輯的系統,可以添加、修改與删除圖形元素,以形成圖形畫面。具體要求如下:
支援圖元為簡單的六種圖形

圖上的黑點給圖元的原點,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<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