QT上位机开发(绘图软件)

news2024/11/25 21:53:00

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        稍微复杂一点的软件,一般都是带有绘图功能。绘图的意义,不仅仅是像CAD一样,可以进行模型的设计、比对和调试。它还可以是流程、仿真和测试功能。当然,如果仿真做的好一点,还可以根据实时传感器拿到的数据进行动画演示。比如大家如果经常看卫星发射,对于仿真界面肯定不陌生。特别是火箭发射的后期,星箭分离的时候,这个时候基本只有动画展示了。

        如今,我们正好借助于qt平台,看看在qt平台上面是如何进行软件的绘制的。

1、实现的功能

        今天,我们实现的功能比较简单,就是利用鼠标实现一个画线的操作。当鼠标被按下去的时候,记录第一个点。在鼠标移动或者鼠标松开的时候,将之前保存的点、当前的点进行直线绘制,同时把当前的点设置为最新的点,为下一次绘制做准备。

2、准备QtWidgetsApplication.h文件

        整个窗口继承了父类QMainWindow。这里面需要实现四个函数,即绘制函数、鼠标按下函数、鼠标移动函数、鼠标松开的函数。注意,这四个函数都是虚函数,我们只需要重新实现即可。另外为了配合着四个函数,还添加pix、lastPoint、endPoint。pix表示画图,lastPoint表示前一个点,end表示当前点。

#pragma once

#include <QtWidgets/QMainWindow>
#include <QMouseEvent>
#include "ui_QtWidgetsApplication.h"

class QtWidgetsApplication : public QMainWindow
{
	Q_OBJECT

public:
	QtWidgetsApplication(QWidget *parent = nullptr);
	~QtWidgetsApplication();

private:
	Ui::QtWidgetsApplicationClass ui;

	QPixmap pix;
	QPoint lastPoint;
	QPoint endPoint;

protected:
	void paintEvent(QPaintEvent *) override;
	void mousePressEvent(QMouseEvent *) override;
	void mouseMoveEvent(QMouseEvent *) override;
	void mouseReleaseEvent(QMouseEvent *) override;
};

3、实现QtWidgetsApplication.cpp文件

        实现过程中主要分成三个部分。第一,需要查看下构造函数是怎么初始化的。这里面比较重要的其实就是pix变量。大家可以把这个pix看成是一个画布,画布上面就是我们绘制的各个形状。当然,画布的内容如果需要显示到窗口上面,还需要调用drawPixelmap拷贝一下。

#include <QPainter>
#include "QtWidgetsApplication.h"

QtWidgetsApplication::QtWidgetsApplication(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

	resize(600, 500);    // windows size is 600 by 500
	pix = QPixmap(600, 500);
	pix.fill(Qt::white);
}

QtWidgetsApplication::~QtWidgetsApplication()
{}

        前面我们说过,鼠标按下、移动、松开,这三个部分都是重载函数,我们直接重写即可,

void QtWidgetsApplication::mousePressEvent(QMouseEvent *event)
{
	if (event->button() == Qt::LeftButton) // mouse left down     
		lastPoint = event->pos();
}

void QtWidgetsApplication::mouseMoveEvent(QMouseEvent *event)
{
	if (event->buttons()&Qt::LeftButton) // mouse left down and move    
	{
		endPoint = event->pos();
		update(); // trigger painter function
	}
}

void QtWidgetsApplication::mouseReleaseEvent(QMouseEvent *event)
{
	if (event->button() == Qt::LeftButton) //mouse left release   
	{
		endPoint = event->pos();
		update();
	}
}

        鼠标按下的时候,所做的工作就是记录下一个lastPoint。鼠标移动和松开的时候,稍微复杂一点,除了记录endPoint之外,还要trigger一下update。有了这个update,系统就会调用paintEvent这个重载函数,重新绘制下界面。所以,这个函数我们也需要重新编写一下。

void QtWidgetsApplication::paintEvent(QPaintEvent *)
{
	QPainter pp(&pix);    // pix is the QPixmap    
	pp.setPen(QPen(QBrush(Qt::black), 3, Qt::SolidLine)); // set width
	pp.drawLine(lastPoint, endPoint);    // paint line now   

	lastPoint = endPoint;
	QPainter painter(this);
	painter.drawPixmap(0, 0, pix);
}

        paintEvent这个函数,个人觉得是整个练习当中最重要的函数。首先pix当中已经有了很多的绘制。这里不过是再增加一条直线而已。所以pp变量绘制的其实是画布的内容。但是仅仅有画布是不够的,我们看到这里还有一个painter变量,它的入参是this,也就是代表这里的绘制才是窗口的绘制,所以它会调用drawPixmap函数,把pix画布的内容拷贝到当前窗口里面。也只有这样,才能实现窗口的内容更新。

4、编译和测试

        代码全部设计好之后,就可以开始编译了。编译没有问题,我们打开软件,利用鼠标开始测试的。测试的方法也不复杂,就是在窗口内依次按下鼠标、移动鼠标、松开鼠标,看看窗口上是不是真的有线条出现,如果是这样,那代表编码没有问题,反之就要回头查查原因了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1349955.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字图像处理(3)——频域图像增强

&#x1f525;博客主页&#xff1a;是dream &#x1f680;系列专栏&#xff1a;深度学习环境搭建、环境配置问题解决、自然语言处理、语音信号处理、项目开发 &#x1f498;每日语录&#xff1a;贤才&#xff0c;难进易出&#xff1b;庸才&#xff0c;易进易初出&#xff1b;…

IDA入门【二】IDA数据显示窗口

主窗口 IDA图形视图 图形视图会让人联想到程序流程图&#xff0c;因为它将一个函数分解成许多基本块&#xff0c;以生动显示该函数由一个块到另一个块的控制流程。 在屏幕上你会发现&#xff0c;IDA使用不同的彩色箭头区分函数块之间各种类型的流。 根据测试条件&#xff0c…

【Spring实战】15 Logback

文章目录 1. 依赖2. 配置3. 打印日志4. 启动程序5. 验证6. 调整日志级别7. 代码详细总结 Spring 作为一个现代化的 Java 开发框架&#xff0c;提供了很多便利的功能&#xff0c;其中包括灵活而强大的日志记录。本文将介绍如何结合 Spring 和 Logback 配置和使用日志&#xff0c…

旅游平台网页前后端

功能清单 游客功能 用户注册、登录登录权限拦截按名称搜索房间支付流程查看订单信息和状态评论预定过的房间&#xff0c;并自动修改订单状态查看统计剩余房间数量&#xff0c;数量为0时不可预定 管理员功能 房间分类管理 类型的删除、修改、查询&#xff08;准备添加增添功能…

一文通透Text Embedding模型:从text2vec、openai-ada-002到m3e、bge

前言 本文一开始是属于此文《知识库问答LangChainLLM的二次开发&#xff1a;商用时的典型问题及其改进方案》的1.2节&#xff0c;但为把Text Embedding模型阐述的更为精准、全面&#xff0c;特把那部分的内容抽取出来&#xff0c;不断完善成此文 第一部分 衡量文本向量表示效果…

【Java系列】文件操作详解

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Java系列专栏】【JaveEE学习专栏】 本专栏旨在分享学习JavaEE的一点学习心得&#xff0c;欢迎大家在评论区交流讨论&#x1f48c; 目录 …

天气预报网站windy的使用简介

原来这些文章我都写在QQ日志里&#xff0c;只为方便自己翻阅&#xff0c;但QQ日志很不好的地方就是没有查找功能&#xff0c;自己想翻看都很不方便&#xff0c;以后就还是在熟悉的CSDN作记录吧。 windy是个很不错的天气预报网站&#xff0c;对喜欢钓鱼的我来说&#xff0c;能方…

Python-docx 深入word源码 带有序号的段落无法设置段后、段前距离、间距等段落属性

如果使用p doc.add_paragraph(内容, styleList Number)来创建序号段落&#xff0c;会发现设置序号段落之间的段前、段后以及段落间距无法生效。后来将docx库生成的word文档打开后发现段落的设置出现问题&#xff0c;如下图红框所示&#xff0c;将该选项去掉即可使段落间距属性…

软件设计模式 --- 类,对象和工厂模式的引入

Q1&#xff1a;什么是软件设计模式&#xff1f; A&#xff1a;软件设计模式&#xff0c;又称设计模式。它是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性。综上&…

mysql原理--MySQL基于规则的优化

设计 MySQL 的大叔依据一些规则&#xff0c;竭尽全力的把一些很糟糕的语句转换成某种可以比较高效执行的形式&#xff0c;这个过程也可以被称作 查询重写 &#xff08;就是人家觉得你写的语句不好&#xff0c;自己再重写一遍&#xff09;。 1.条件化简 我们编写的查询语句的搜…

怎么给直播录屏?超简单教程,一学就会!

随着直播行业的兴起&#xff0c;许多玩家和观众都希望能够录制直播内容以方便随时回顾或与他人分享。可是怎么给直播录屏呢&#xff1f;本文将详细介绍两种流行的直播录屏方法。通过学习这两种工具&#xff0c;你可以轻松实现直播录屏&#xff0c;记录并分享你的直播内容。 怎么…

jsp结合servlet

servlet配置 环境配置2023.12.31 idea配置搭建 创建一个普通的java项目 由于新版idea去除了add framework support的ui显示&#xff0c;可以在左边项目栏中使用快捷键shiftk或者setting中搜索add framework support在修改对应的快捷键 点击ok然后应该就是下面这样的结果 这里…

Zookeeper-Zookeeper选举源码

看源码方法&#xff1a; 1、先使用&#xff1a;先看官方文档快速掌握框架的基本使用 2、抓主线&#xff1a;找一个demo入手&#xff0c;顺藤摸瓜快速静态看一遍框架的主线源码&#xff0c;画出源码主流程图&#xff0c;切勿一开始就陷入源码的细枝末节&#xff0c;否则会把自…

用户侧智能配电与智能用电系统的应用及未来——安科瑞 顾烊宇

摘要&#xff1a;随着科技的发展&#xff0c;电力系统正逐步向智能化、数字化、互联网化迈进。智能配电与智能用电是电力产业发展的重要方向&#xff0c;将为传统电力系统带来革命性的变革。本文将对智能配电和智能用电的概念、特点、关键技术及应用进行详细介绍。 1、智能配电…

SQL Server从0到1——基本语法

信息收集 用户&#xff1a; 当前用户名&#xff1a; select user 用户权限&#xff1a; 服务器级别&#xff1a; select IS_SRVROLEMEMBER(sysadmin) 数据库级别&#xff1a; select IS_MEMBER(db_owner) 2005的xp_cmdshell 你要知道他的权限一般是system 而2008他是nt …

云计算:OpenStack 分布式架构添加LVM存储(单控制节点与多计算节点)

目录 一、实验 1.环境 2.安装并配置控制节点 3. 安装并配置存储节点 4.使用LVM存储 一、实验 1.环境 (1) 主机 表1 主机 主机架构IP备注controller控制节点192.168.204.210已部署compute01计算节点1192.168.204.211 已部署compute02计算节点2192.168.204.212已部署sto…

Docker:部署若依前后端分离版

Docker&#xff1a;部署若依前后端分离版 1. 停止天翼云上的原来跑的若依项目2. 停止腾讯云上的若依项目3. 使用Docker部署3.1 天翼云数据库&Redis3.1.1 部署数据库3.1.2 部署Redis数据库3.1.1 部署Nginx(这里被天翼云坑了换的腾讯云运行nginx) 3.2 腾讯云部署后端&前端…

ubuntu 20.04 自由切换 python 的版本

问题描述 当前 ubuntu 20.04 默认安装了多个 python 的版本&#xff0c;执行 python 时&#xff0c;默认版本是 Python 2.7.18 zhangszzhangsz:~$ python Python 2.7.18 (default, Jul 1 2022, 12:27:04) [GCC 9.4.0] on linux2 Type "help", "copyright&quo…

【unity知识点】Unity 协程Coroutine

文章目录 前言使用协程的步骤&#xff1a;使用场景示例&#xff1a;yield return new WaitForSeconds和yield return new WaitForFixedUpdate的区别开始和停止携程完结 前言 Unity 协程是一种特殊的函数&#xff0c;可以在游戏中实现延迟执行、按顺序执行和异步操作等功能。它…

多人协同开发git flow,创建初始化项目版本

文章目录 多人协同开发git flow&#xff0c;创建初始化项目版本1.gitee创建组织模拟多人协同开发2.git tag 打标签3.git push origin --tags 多人协同开发git flow&#xff0c;创建初始化项目版本 1.gitee创建组织模拟多人协同开发 组织中新建仓库 推送代码到我们组织的仓库 2…