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

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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、编译和测试

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mysql之四大引擎、账号管理以及建库

一.数据库存储引擎 1.1存储引擎的查看 1.2InnoDB 1.3MyISAM 1.4 MEMORY 1.5 Archive 二.数据库管理 2.1元数据库简介 2.2元数据库分类 2.3 相关操作 2.4 MySQL库 三.数据表管理 3.1三大范式 3.2 基本数据类型 3.2.1优化原则 3.3 整形 3.4 实数 3.5 字符串 3.6 text&…

Java反射机制和动态代理

反射和动态代理 反射前言获取class对象的方式反射获取构造方法反射获取成员变量反射获取成员方法实例 动态代理 反射 前言 什么是反射&#xff1f; 反射允许对成员变量&#xff0c;成员方法和构造方法的信息进行编程访问。 为什么用反射 / 反射的作用&#xff1f; 可以轻易地获…

Scene Creator

场景创建器是一个方便、易于使用的编辑工具&#xff0c;旨在简化创建新场景的过程。使用场景创建器&#xff0c;您可以选择一个模板场景&#xff0c;定义一个目录来存储您的场景&#xff0c;并在需要时自动将新场景添加到构建中。 下载&#xff1a; ​​Unity资源商店链接 资…

微软好听的tts语音包下载,粤语,韩语,日语

微软的 tts 语音库&#xff0c;都是离线的&#xff0c;所以速度非常快 但资源比较少&#xff0c;比如粤语&#xff0c;韩语&#xff0c;日语 我发现一个老牌语音技术供应商。 资源丰富&#xff0c;可自行下载免费或收费语音包。 网站&#xff1a;正版用户专用配套播音员下载…

im6ull学习总结(三-2)文字显示中文字符

承接上篇文章 中文字符的点阵显示 使用点阵字库时&#xff0c;中文字符的显示原理跟 ASCII 字符是一样的。要注意的地方在于中文的编码&#xff1a;在 C 源文件中它的编码方式是 GB2312 还是 UTF-8&#xff1f;编译出的可执行程序&#xff0c;其中的汉字编码方式是 GB2312 还…

机器学习(二) -- 数据预处理(2)

系列文章目录 机器学习&#xff08;一&#xff09; -- 概述 机器学习&#xff08;二&#xff09; -- 数据预处理&#xff08;1-3&#xff09; 机器学习&#xff08;三&#xff09; -- 特征工程&#xff08;1-2&#xff09; 未完待续…… 目录 系列文章目录 前言 四、【数…

三、C语言中的分支与循环—while循环 (5)

本章分支结构的学习内容如下&#xff1a; 三、C语言中的分支与循环—if语句 (1) 三、C语言中的分支与循环—关系操作符 (2) 三、C语言中的分支与循环—条件操作符 与逻辑操作符(3) 三、C语言中的分支与循环—switch语句&#xff08;4&#xff09;分支结构 完 本章循环结…

部署上传漏洞的靶场环境upload-labs

1、工具介绍 upload-labs是一个使用php语言编写的&#xff0c;专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场。旨在帮助大家对上传漏洞有一个全面的了解。目前一共20关&#xff0c;每一关都包含着不同上传方式。 upload-labs靶场开源地址&#xff1a;&#xff1a;https://…

Android14之禁掉Selinux的两种方式(一百七十四)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

经典卷积神经网络-ResNet

经典卷积神经网络-ResNet 一、背景介绍 残差神经网络(ResNet)是由微软研究院的何恺明、张祥雨、任少卿、孙剑等人提出的。ResNet 在2015 年的ILSVRC&#xff08;ImageNet Large Scale Visual Recognition Challenge&#xff09;中取得了冠军。残差神经网络的主要贡献是发现了…

为什么python值得学习,python的应用领域。

文章目录 前言Web 应用开发自动化运维网络爬虫数据分析科学计算人工智能胶水语言Python技术资源分享1、Python所有方向的学习路线2、学习软件3、入门学习视频4、实战案例5、清华编程大佬出品《漫画看学Python》6、Python副业兼职与全职路线 前言 说起编程语言&#xff0c;Pyth…

【电商项目实战】购物车完善

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《电商项目实战》。&#x1f3af;&#x1f3af; &am…

ElasticSearch的DSL查询语法解析

Elasticsearch提供了基于ISON的DSL (Domain Specific Lanquage)来定义查询。 目录 一、常见查询类型 二、DSLQuery基本语法 三、全文检索查询 3.1 match查询&#xff1a;会对用户输入内容分词&#xff0c;常用于搜索框搜索 &#xff0c;语法&#xff1a; 3.2 multi match…

基于矩阵乘的CUDA编程优化过程

背景&#xff1a;网上很多关于矩阵乘的编程优化思路&#xff0c;本着看理论分析万遍&#xff0c;不如实际代码写一遍的想法&#xff0c;大概过一下优化思路。 矩阵乘的定义如下&#xff0c;约定矩阵的形状及存储方式为: A[M, K], B[K, N], C[M, N]。 CPU篇 朴素实现方法 按照…

canvas绘制网格线示例

查看专栏目录 canvas示例教程100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

自动化测试:等待方式

在自动化测试中&#xff0c;等待是一个重要的技术&#xff0c;用于处理页面加载、元素定位、元素状态改变等延迟问题。 等待能够确保在条件满足后再进行后续操作&#xff0c;提高自动化测试的稳定性以及可靠性。 等待方式&#xff1a;显示等待、隐式等待、线程睡眠 1. 显式等…

【学习笔记】环论

子环环同态理想单位元&#xff08;乘法单位元&#xff09;环与子环的单位元无必然关系,即子环不一定有单位元&#xff0c;有也不一定和环的单位元相同 比如 Z 6 Z_6 Z6​有单位元1&#xff0c;其子环 ( 2 ) (2) (2)单位元为4;Z有单位元1&#xff0c;其子环2Z没有单位元若R有单位…

B站不赚钱、“芒果”赚钱难,视频“后浪”火拼跨年夜

又是一年跨年时。 各大视频平台跨年晚会展开火拼&#xff0c;今年谁是赢家&#xff1f; 作为视频“后浪”&#xff0c;芒果超媒&#xff08;300413.SZ&#xff09;、哔哩哔哩&#xff08;09626.HK&#xff0c;下称“B站”&#xff09;此前相继公布了2023年三季报&#xff0c;…

什么是缓存、为什么要用缓存、缓存分类、缓存测试、缓存更新、缓存设计考虑点、缓存测试点

一、缓存 缓存是一种将数据存储在高速缓存中的技术&#xff0c;它可以提高应用程序的性能和响应速度。 二、 为什么要用缓存 1. 高性能(主要目的) 查询耗时&#xff0c;但变化少&#xff0c;又有很多读请求情况下&#xff0c;可以将查询结果放到缓存中。减少对数据库的压力&…

2024/1/2作业

成果 代码 main .c #include "sqi.h" #include "si7006.h" unsigned int num[10] {0xFC, 0x60, 0xDA,0xF2,0x66,0xB6,0xBE,0XE0,0xFE,0xF6}; //unsigned int wei[5]{0x10,0x20,0x40,0x80,0xF0}; unsigned short hum; short tem; extern void printf(…