Qt/C++ 基于 QGraphicsView 的绘图软件 (附源码下载链接)

基于 Qt 的 QGraphicsView 绘图软件项目进行深入讲解,分析其核心代码与功能实现,帮助开发者理解 QGraphicsView 的用法。


项目概览

该项目实现了一个简单的绘图应用,用户可以在界面中创建和编辑矩形、椭圆、直线、多边形和文本等图形对象。功能包括添加图形、设置属性(颜色、字体)、移动、缩放、旋转、组合、删除等。


项目概览

cpp 复制代码
通过网盘分享的文件:基于 QGraphicsView 的绘图软件
链接: https://pan.baidu.com/s/1g-thPifZmPKhLHJ8KFoL2w?pwd=jkcf 提取码: jkcf

核心代码讲解

1. 初始化与场景设置

cpp 复制代码
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 创建 QGraphicsScene,并设置范围
    scene = new QGraphicsScene(-300, -200, 600, 400);

    // 将场景绑定到视图
    ui->View->setScene(scene);

    // 设置鼠标样式和拖拽模式
    ui->View->setCursor(Qt::CrossCursor);
    ui->View->setMouseTracking(true);
    ui->View->setDragMode(QGraphicsView::RubberBandDrag);

    // 初始化状态栏信息
    labViewCord = new QLabel(tc("View 坐标:"));
    labSceneCord = new QLabel(tc("Scene 坐标:"));
    labItemCord = new QLabel(tc("Item 坐标:"));
    labItemInfo = new QLabel(tc("ItemInfo: "));

    ui->statusBar->addWidget(labViewCord);
    ui->statusBar->addWidget(labSceneCord);
    ui->statusBar->addWidget(labItemCord);
    ui->statusBar->addWidget(labItemInfo);
}
  • QGraphicsScene:定义绘图区域,设置范围为 (-300, -200) 到 (300, 200)。
  • QGraphicsView :作为窗口的显示组件,绑定场景 scene,支持鼠标拖拽和实时追踪。
  • 状态栏:显示鼠标坐标、选中项的信息,便于交互。

2. 鼠标事件处理

鼠标移动事件
cpp 复制代码
void MainWindow::on_mouseMovePoint(QPoint point)
{
    labViewCord->setText(tc("View 坐标:%1,%2").arg(point.x()).arg(point.y()));
    QPointF pointScene = ui->View->mapToScene(point);
    labSceneCord->setText(tc("Scene 坐标:%1,%2").arg(pointScene.x()).arg(pointScene.y()));
}
  • 获取鼠标的视图坐标,并将其转换为场景坐标,通过状态栏实时显示。
鼠标单击事件
cpp 复制代码
void MainWindow::on_mouseClicked(QPoint point)
{
    QPointF pointScene = ui->View->mapToScene(point);
    QGraphicsItem *item = scene->itemAt(pointScene, ui->View->transform());

    if (item != nullptr)
    {
        QPointF pointItem = item->mapFromScene(pointScene);
        labItemCord->setText(tc("Item 坐标:%1,%2").arg(pointItem.x()).arg(pointItem.y()));
        labItemInfo->setText(item->data(ItemDesciption).toString() + tc(", ItemId=") +
                             item->data(ItemId).toString());
    }
}
  • 根据鼠标位置获取场景坐标,并检测该位置的绘图项。
  • 如果有绘图项,显示其局部坐标和描述信息(ItemIdItemDescription)。
鼠标双击事件
cpp 复制代码
void MainWindow::on_mouseDoubleClick(QPoint point)
{
    QPointF pointScene = ui->View->mapToScene(point);
    QGraphicsItem *item = scene->itemAt(pointScene, ui->View->transform());
    if (item == nullptr) return;

    switch (item->type())
    {
        case QGraphicsRectItem::Type: // 矩形
        {
            QGraphicsRectItem *theItem = qgraphicsitem_cast<QGraphicsRectItem*>(item);
            setBrushColor(theItem);
            break;
        }
        case QGraphicsEllipseItem::Type: // 椭圆
        {
            QGraphicsEllipseItem *theItem = qgraphicsitem_cast<QGraphicsEllipseItem*>(item);
            setBrushColor(theItem);
            break;
        }
        case QGraphicsTextItem::Type: // 文本
        {
            QGraphicsTextItem *theItem = qgraphicsitem_cast<QGraphicsTextItem*>(item);
            QFont font = QFontDialog::getFont(nullptr, theItem->font(), this, tc("设置字体"));
            if (font.isValid())
                theItem->setFont(font);
            break;
        }
    }
}
  • 鼠标双击弹出对话框,根据绘图项类型设置填充颜色或字体。
  • 使用 qgraphicsitem_castQGraphicsItem 转换为具体类型。

3. 添加绘图项

添加矩形
cpp 复制代码
void MainWindow::on_actItem_Rect_triggered()
{
    QGraphicsRectItem *item = new QGraphicsRectItem(-50, -25, 100, 50);
    item->setFlags(QGraphicsItem::ItemIsMovable |
                   QGraphicsItem::ItemIsSelectable |
                   QGraphicsItem::ItemIsFocusable);
    item->setBrush(QBrush(Qt::yellow));
    item->setZValue(++frontZ);
    scene->addItem(item);
}
  • 使用 QGraphicsRectItem 创建矩形。
  • 设置属性:
    • 可移动、可选中、可聚焦。
    • 填充颜色为黄色,Z 值递增(调整叠放顺序)。
添加文本
cpp 复制代码
void MainWindow::on_actItem_Text_triggered()
{
    QString str = QInputDialog::getText(this, tc("输入文字"), tc("请输入文字"));
    if (str.isEmpty()) return;

    QGraphicsTextItem *item = new QGraphicsTextItem(str);
    QFont font = this->font();
    font.setPointSize(20);
    font.setBold(true);
    item->setFont(font);
    scene->addItem(item);
}
  • 使用 QGraphicsTextItem 创建文本,用户通过对话框输入文字。
  • 设置字体大小为 20,并加粗。

4. 操作绘图项

删除选中项
cpp 复制代码
void MainWindow::on_actEdit_Delete_triggered()
{
    int cnt = scene->selectedItems().count();
    for (int i = 0; i < cnt; i++)
    {
        QGraphicsItem *item = scene->selectedItems().at(0);
        scene->removeItem(item);
    }
}
  • 遍历选中项列表,逐个从场景中删除。
缩放与旋转
cpp 复制代码
void MainWindow::on_actZoomIn_triggered()
{
    ui->View->scale(1.1, 1.1); // 放大视图
}

void MainWindow::on_actRotateLeft_triggered()
{
    ui->View->rotate(-30); // 逆时针旋转视图
}
  • 放大视图的比例(scale)。
  • 顺时针/逆时针旋转视图(rotate)。
组合与解除组合
cpp 复制代码
void MainWindow::on_actGroup_triggered()
{
    QGraphicsItemGroup *group = new QGraphicsItemGroup;
    scene->addItem(group);
    foreach (QGraphicsItem *item, scene->selectedItems())
    {
        group->addToGroup(item);
    }
}

void MainWindow::on_actGroupBreak_triggered()
{
    QGraphicsItemGroup *group = qgraphicsitem_cast<QGraphicsItemGroup *>(scene->selectedItems().at(0));
    scene->destroyItemGroup(group);
}
  • 使用 QGraphicsItemGroup 将多个绘图项组合,方便整体操作。
  • 使用 destroyItemGroup 解除组合。

总结

该项目通过 Qt 提供的 QGraphicsView 框架,实现了一个简单但功能丰富的绘图软件。其核心功能包括:

  1. 绘图功能:支持矩形、椭圆、多边形、文本等图形的添加与属性设置。
  2. 交互功能:支持鼠标操作、移动、缩放、旋转等。
  3. 编辑功能:支持组合、解除组合、删除、层次调整。
相关推荐
沉到海底去吧Go1 分钟前
【图片识别改名】批量读取图片区域文字识别后批量改名,基于Python和腾讯云的实现方案
开发语言·python·腾讯云
ttk2195 分钟前
【算法练习】归并排序和归并分治
数据结构·c++·算法·排序算法
MarkHD13 分钟前
第一天 车联网定义、发展历程与生态体系
开发语言·php
百锦再18 分钟前
Python深度挖掘:openpyxl和pandas的使用详细
java·开发语言·python·框架·pandas·压力测试·idea
mooridy20 分钟前
设计模式 | 详解常用设计模式(六大设计原则,单例模式,工厂模式,建造者模式,代理模式)
c++·设计模式
microhex23 分钟前
Glide 如何加载远程 Base64 图片
java·开发语言·glide
chilling heart31 分钟前
JAVA---集合ArrayList
java·开发语言
梁辰兴1 小时前
数据结构:实验7.3Huffman树与Huffman编码
数据结构·c++·算法·c
小_t_同学1 小时前
C++之类和对象:构造函数,析构函数,拷贝构造,赋值运算符重载
开发语言·c++
wuqingshun3141591 小时前
经典算法 最长单调递增子序列
java·c++·算法·蓝桥杯·机器人