news 2026/4/23 13:45:20

基于Qt的视觉工具连线Demo源码剖析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于Qt的视觉工具连线Demo源码剖析

基于qt的视觉工具连线demo源码,支持连线,单选删除,多选删除,可以保存加载

在开发图形化交互工具时,实现元素间的连线以及相关的增删改存功能是常见需求。今天咱们就来聊聊基于Qt的视觉工具连线Demo源码,这个源码支持连线操作,还有单选删除、多选删除,并且能实现保存与加载功能。

项目结构概述

这个Qt项目结构清晰,主要分为几个关键部分:界面设计、逻辑处理以及数据存储相关代码。

界面设计部分

Qt提供了强大的UI设计工具,通常我们会在.ui文件中设计基础界面布局。假设我们有一个主窗口,在其中绘制用于展示连线的区域。

// 在主窗口类的构造函数中,加载ui文件 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); // 初始化一些自定义的绘图区域属性 QGraphicsScene *scene = new QGraphicsScene(this); ui->graphicsView->setScene(scene); }

这里我们通过ui->setupUi(this)加载设计好的界面,然后创建了一个QGraphicsScene用于在QGraphicsView中展示图形元素,后续的连线以及可操作的节点等都会在这个场景中绘制。

连线功能实现

连线功能实现的核心在于QGraphicsLineItem的使用。

// 创建连线 void createConnection(QGraphicsItem *startItem, QGraphicsItem *endItem) { QLineF line(startItem->pos(), endItem->pos()); QGraphicsLineItem *connection = new QGraphicsLineItem(line); QPen pen(Qt::black); pen.setWidth(2); connection->setPen(pen); scene->addItem(connection); }

上述代码中,我们通过获取起始和结束节点的位置创建一条直线,然后设置线条的画笔属性,比如颜色为黑色,宽度为2,最后将这条连线添加到场景中。

单选删除与多选删除

单选删除较为简单,我们可以通过检测鼠标点击事件,判断点击的是哪个图形元素,然后进行删除。

void MainWindow::mousePressEvent(QMouseEvent *event) { QGraphicsItem *item = ui->graphicsView->scene()->itemAt(event->pos(), QTransform()); if (item) { ui->graphicsView->scene()->removeItem(item); delete item; } QMainWindow::mousePressEvent(event); }

当鼠标点击时,itemAt函数会返回鼠标点击位置的图形元素,如果存在该元素,我们就将其从场景中移除并释放内存。

对于多选删除,Qt提供了选择区域绘制等功能。我们可以通过QRect来定义一个选择区域,获取区域内的所有图形元素并删除。

void MainWindow::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { selectionStart = event->pos(); isSelecting = true; } QMainWindow::mousePressEvent(event); } void MainWindow::mouseReleaseEvent(QMouseEvent *event) { if (isSelecting) { QRect selectionRect(selectionStart, event->pos()); QList<QGraphicsItem*> selectedItems = ui->graphicsView->scene()->items(selectionRect); foreach (QGraphicsItem *item, selectedItems) { ui->graphicsView->scene()->removeItem(item); delete item; } isSelecting = false; } QMainWindow::mouseReleaseEvent(event); }

这里我们通过mousePressEvent记录选择起始位置,在mouseReleaseEvent中获取选择区域内的所有图形元素并删除。

保存与加载

保存与加载功能通常使用文件读写操作。我们可以将场景中的图形元素信息,比如位置、类型等保存到文件中。

void saveScene(const QString &fileName) { QFile file(fileName); if (file.open(QIODevice::WriteOnly | QIODevice::Text)) { QTextStream out(&file); QList<QGraphicsItem*> items = scene->items(); foreach (QGraphicsItem *item, items) { out << item->type() << " " << item->pos().x() << " " << item->pos().y() << "\n"; // 如果是连线,还需要记录起始和结束节点信息等 if (item->type() == QGraphicsLineItem::Type) { QGraphicsLineItem *line = static_cast<QGraphicsLineItem*>(item); out << line->line().x1() << " " << line->line().y1() << " " << line->line().x2() << " " << line->line().y2() << "\n"; } } file.close(); } }

加载功能则是从文件中读取信息,重新创建图形元素并添加到场景。

void loadScene(const QString &fileName) { QFile file(fileName); if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream in(&file); while (!in.atEnd()) { QString line = in.readLine(); QStringList parts = line.split(" "); int type = parts[0].toInt(); qreal x = parts[1].toDouble(); qreal y = parts[2].toDouble(); if (type == QGraphicsLineItem::Type) { QString line2 = in.readLine(); QStringList lineParts = line2.split(" "); qreal x1 = lineParts[0].toDouble(); qreal y1 = lineParts[1].toDouble(); qreal x2 = lineParts[2].toDouble(); qreal y2 = lineParts[3].toDouble(); QGraphicsLineItem *connection = new QGraphicsLineItem(QLineF(QPointF(x1, y1), QPointF(x2, y2))); QPen pen(Qt::black); pen.setWidth(2); connection->setPen(pen); scene->addItem(connection); } else { // 创建其他类型图形元素,比如节点等 } } file.close(); } }

通过这样的文件读写操作,我们就能实现场景的保存与加载。

总的来说,这个基于Qt的视觉工具连线Demo源码涵盖了图形化界面开发中多个重要的功能点,通过合理运用Qt的各类图形和文件操作相关类,能高效实现一个功能丰富的视觉工具。希望这篇剖析能帮助大家更好地理解和运用相关知识。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 13:11:21

10个AI支持的论文写作工具,高效复现数学建模论文并优化

AI工具的核心对比可帮助Java毕业论文用户快速筛选&#xff0c;以下表格清晰呈现了10款推荐工具的主要优势、处理时间及适配平台等关键信息。 工具名称 主要用途 处理时间 适配平台 关键优势 askpaper 降AIGC率&#xff0c;降重复率 约20分钟 知网、格子达、维普 AIGC检…

作者头像 李华
网站建设 2026/4/22 15:36:03

Java List学习笔记:ArrayList与LinkedList的实现源码分析

List接口 List 列表是Collection集合的子接口&#xff0c;List是有序、可索引、可重复元素的集合。 有序&#xff1a;是指List中的元素按顺序依次添加可索引&#xff1a;是指List中的元素可以像数组一样&#xff0c;通过索引获取元素可重复&#xff1a;是指List中的元素可重复添…

作者头像 李华
网站建设 2026/4/23 11:32:28

²⁰²⁶/₀₁.₀₁2026年的第一天,请这样发朋友圈

❶.ℍ&#x1d55a;, ⁰⁶‘’ 干了这杯奶茶&#x13212; &#x13082; &#x133f8; 明年体重不涨价&#xff5e;❷.&#x11284;&#x118e0;&#x11284;&#x11d59;&#x1f964;&#x1f35f;&#x1f9e7; •͈ᴗ⁃͈ "神马美食都炫 神马肥肉都跑"❸.&…

作者头像 李华
网站建设 2026/4/18 14:03:34

开源项目分享 : Gitee热榜项目 2026-1-1 日榜

本文档整理Gitee当日热门开源项目&#xff0c;包含名称、链接、星级、描述及趋势分析。 2026的第一天我们来看看gitee上面有哪些热门项目呢 1. JeeLowCode 项目链接&#xff1a;https://gitee.com/jeelowcode/JeeLowCodeStar 数&#xff1a;9758项目描述&#xff1a;&#x1…

作者头像 李华
网站建设 2026/4/23 11:31:48

集体好奇心在教育领域的应用

集体好奇心在教育领域的应用 关键词:集体好奇心、教育领域、学习动机、协作学习、创新教育 摘要:本文聚焦于集体好奇心在教育领域的应用。首先介绍了集体好奇心的背景,包括其目的、适用的预期读者、文档结构和相关术语。接着阐述了集体好奇心的核心概念及与教育的联系,分析…

作者头像 李华