QT上位机开发(键盘绘图控制)

news2024/11/24 18:40:59

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

        绘图是qt很基础的一个功能。通常,我们进行qt绘图的时候,一般会先创建一个qt view,这个相当于视图。接着创建一个场景scene,场景和视图是一对多的关系,比如相同的场景可以正着看、反着看、旋转着看等等,这样就会有多个view。有了场景之后呢,我们就可以在上面添加物体了,这个物体就是各种各样形状的内容。今天,我们借着键盘绘图的需求,看下qt下面view-scene-item是怎么一个情况。

1、首先创建一个widget工程

        widget工程是我们开发的一个基础,虽然里面的代码基本不用,但是需要这样的一个基本框架。

2、接着创建绘制的物体

        绘制的物体一般都要继承QGraphicsPolygonItem,后期这个类就会被添加到scene当中。因为本次的需求是响应各种按键功能,所以还要重写一下keyPressEvent函数。

#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsPolygonItem>
#include <QKeyEvent>

class TriangleItem : public QGraphicsPolygonItem
{
public:
	TriangleItem(QGraphicsItem* parent = nullptr) : QGraphicsPolygonItem(parent)
	{
		QPolygonF triangle;
		triangle << QPointF(0, -50) << QPointF(25, 25) << QPointF(-25, 25);
		setPolygon(triangle);
	}

	~TriangleItem()
	{}

	void keyPressEvent(QKeyEvent* event) override
	{
		QPointF currentPosition = pos();

		switch (event->key())
		{
		case Qt::Key_Up:
			currentPosition.setY(currentPosition.y() - 10);
			break;

		case Qt::Key_Down:
			currentPosition.setY(currentPosition.y() + 10);
			break;

		case Qt::Key_Left:
			currentPosition.setX(currentPosition.x() - 10);
			break;

		case Qt::Key_Right:
			currentPosition.setX(currentPosition.x() + 10);
			break;

		default:
			break;
		}

		setPos(currentPosition);
	}
};

3、重写QGraphicsView类

        当view中接收到按键消息之后,第一个处理的,一般是view里面的keyPressEvent函数。我们目前的处理方法就是,首先在view里面识别到按键事件,然后判断当前按键是不是TriangleItem,如果是,就继续调用对应类的keyPressEvent函数。

class GraphicsView : public QGraphicsView
{
public:
	GraphicsView(QGraphicsScene* scene, QWidget* parent = nullptr) : QGraphicsView(scene, parent) 
	{}

	~GraphicsView()
	{}

protected:
	void keyPressEvent(QKeyEvent* event) override
	{
		QGraphicsScene* graphicsScene = scene();
		if (graphicsScene)
		{
			QList<QGraphicsItem*> items = graphicsScene->items();
			for (QGraphicsItem* item : items)
			{
				if (TriangleItem* triangle = dynamic_cast<TriangleItem*>(item))
				{
					triangle->keyPressEvent(event);
					return;
				}
			}
		}

		QGraphicsView::keyPressEvent(event);
	}
};

4、构建基本的view-scene-item流程

        qt下面的构建方法还是比较清晰的,首先是创建一个scene变量,用scene变量创建一个view变量。简单设置好大小之后,创建一个triangle的item,保存在scene场景中。最后view简单设置了属性之后,直接show出来。基本逻辑就是这样。

        另外需要注意的是,这里的view,就可以看成一种普通的控件。它和标准的ListView、TreeView、TableView等等,都是一样的。本身也可以集成到main window下面。

int main(int argc, char *argv[])
{
	QApplication app(argc, argv);

	QGraphicsScene scene;
	GraphicsView view(&scene);
	view.resize(600, 450);

	TriangleItem *triangle = new TriangleItem();
	scene.addItem(triangle);

	view.setRenderHint(QPainter::Antialiasing);
	view.setRenderHint(QPainter::SmoothPixmapTransform);

	view.show();
	return app.exec();
}

5、测试和验证

        代码编写好了之后,简易编译测试下。这里面包括显示是否正确,按键是否有反应,以及对应函数设置断点后是否真的会断注之类的。

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

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

相关文章

使用git submodule解决高耦合度问题

引言 在开发我的笔记系统时&#xff0c;我遇到了一个问题。问题是&#xff0c;在api-gate服务中&#xff0c;我需要验证用户的access_code&#xff0c;但是access_code的生成逻辑是在auth2服务中实现的。这个问题从架构设计的层面上看&#xff0c;就是一个高耦合度问题。高耦合…

Linux文件系统与日志管理

目录 一、inode和block 1、inode表结构 2、 查看inode号码的命令 3、Linux系统文件三个主要时间属性 4、用户通过文件名打开文件时系统内部的过程 5、inode的大小 6、命令与inode 6.1 cp 命令&#xff1a; 6.2 rm 命令&#xff1a; 6.3 mv命令 二、日志 1、功能 2、…

patch-package的使用总结

有时使用了某个第三方库&#xff0c;可是它有些问题&#xff0c;我们不得不修改它的源码。我们可能不方便给原作者提 Pull Request&#xff0c;因为他们可能不愿意接受我们的更改。又或者原作者无法及时发布新版本。我们只有去修改 node_modules 目录下的文件。可是当我们执行 …

计算机组成原理-程序查询方式(流程图 演示过程 例题 定时查询 独占查询)

文章目录 总览IO方式简介程序查询方式程序查询方式流程图程序查询方式-例题小结 总览 IO方式简介 每次输一个字&#xff0c;就认为状态完成&#xff0c;CPU就会取走数据寄存器的内容 程序查询方式 此时模拟打印三个字符 假设此时三个字符在主存&#xff0c;CPU先从主存读一…

朴素贝叶斯(Naive Bayes)

什么是机器学习 朴素贝叶斯&#xff08;Naive Bayes&#xff09;是一组基于贝叶斯定理的分类算法&#xff0c;它基于特征之间的独立性假设&#xff0c;因此被称为“朴素”。尽管这个假设在实际情况中往往不成立&#xff0c;但朴素贝叶斯在实践中表现得相当好&#xff0c;并在文…

cpp_10_多重继承_钻石继承_虚继承

1 多重继承 一个类可以同时从多个基类继承实现代码。 1.1 多重继承的内存布局 子类对象内部包含多个基类子对象。 按照继承表的顺序依次被构造&#xff0c;析构的顺序与构造严格相反。 各个基类子对象按照从低地址到高地址排列。 // miorder.cpp 多重继承&#xff1a;一个子…

电脑找不到d3dcompiler43.dll怎么修复,教你5个可靠的方法

d3dcompiler43.dll是Windows操作系统中的一个重要动态链接库文件&#xff0c;主要负责Direct3D编译器的相关功能。如果“d3dcompiler43.dll丢失”通常会导致游戏无法正常运行或者程序崩溃。为了解决这个问题&#xff0c;我整理了以下五个解决方法&#xff0c;希望能帮助到遇到相…

深度学习算法应用实战 | 利用 CLIP 模型进行“零样本图像分类”

文章目录 1. 零样本图像分类简介1.1 什么是零样本图像分类?1.2 通俗一点的解释 2. 模型原理图3. 环境配置4. 代码实战5. Gradio前端页面5.1 什么是 Gradio ? 6 进阶操作7. 总结 1. 零样本图像分类简介 1.1 什么是零样本图像分类? “零样本图像分类”&#xff08;Zero-shot …

NLP|LSTM+Attention文本分类

目录 一、Attention原理简介 二、LSTMAttention文本分类实战 1、数据读取及预处理 2、文本序列编码 3、LSTM文本分类 三、划重点 少走10年弯路 LSTM是一种特殊的循环神经网络&#xff08;RNN&#xff09;&#xff0c;用于处理序列数据和时间序列数据的建模和预测。而在N…

66、python - 代码仓库介绍

上一节,我们可以用自己手写的算法以及手动搭建的神经网络完成预测了,不知各位同学有没有自己尝试来预测一只猫或者一只狗,看看准确度如何? 本节应一位同学的建议,来介绍下 python 代码仓库的目录结构,以及每一部分是做什么? 我们这个小课的代码实战仓库链接为:cv_lea…

springboot医院信管系统源码和论文

随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&#xf…

【Linux 内核源码分析笔记】系统调用

在Linux内核中&#xff0c;系统调用是用户空间程序与内核之间的接口&#xff0c;它允许用户空间程序请求内核执行特权操作或访问受保护的内核资源。系统调用提供了一种安全可控的方式&#xff0c;使用户程序能够利用内核功能而不直接访问底层硬件。 系统调用&#xff1a; 通过…

代理IP连接不上/网速过慢?如何应对?

当您使用代理时&#xff0c;您可能会遇到不同的代理错误代码显示代理IP连不通、访问失败、网速过慢等种种问题。 在本文中中&#xff0c;我们将讨论您在使用代理IP时可能遇到的常见错误、发生这些错误的原因以及解决方法。 一、常见代理服务器错误 当您尝试访问网站时&#…

关于Geek软件的下载

直接百度搜geek出来的前几条似乎都是广告&#xff1a; 点进去之后是这个界面&#xff1a; 然后安装到最后一步提示要付费才能安装成功&#xff1a; 然后如果是用谷歌搜索&#xff1a; 有free版和pro版&#xff1a; free版下载之后压缩包解压就是exe不需要安装 综上&#xff0c…

金蝶EAS pdfviewlocal 任意文件读取漏洞

产品简介 金蝶EAS 为集团型企业提供功能全面、性能稳定、扩展性强的数字化平台&#xff0c;帮助企业链接外部产业链上下游&#xff0c;实现信息共享、风险共担&#xff0c;优化生态圈资源配置&#xff0c;构筑产业生态的护城河&#xff0c;同时打通企业内部价值链的数据链条&a…

【leetcode】力扣热门算法之K个一组翻转链表【困难】

题目描述 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 你不能只是单纯的改变节…

JS-基础语法(一)

JavaScript简单介绍 变量 常量 数据类型 类型转换 案例 1.JavaScript简单介绍 JavaScript 是什么&#xff1f; 是一种运行在客户端&#xff08;浏览器&#xff09;的编程语言&#xff0c;可以实现人机交互效果。 JS的作用 JavaScript的组成 JSECMAScript( 基础语法 )…

JavaSE 反射、枚举及Lambda的使用

目录 1 反射1.1 定义1.2 用途1.3 反射基本信息1.4 反射相关的类1.4.1 Class类(反射机制的起源 )1.4.1.1 Class类中的相关方法 1.4.2 反射示例1.4.2.1 获得Class对象的三种方式1.4.2.2 反射的使用 1.5 优缺点 2 枚举2.1 背景及定义2.2 使用2.3 优缺点2.4 枚举和反射2.5 总结2.6 …

调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配

作者推荐 【动态规划】C算法312 戳气球 关键字&#xff1a; 函数调用约定 混合编程 __stdcall c WINAPI APIENTRY _cdecl 调用方出错提示如下&#xff1a; 调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。请检查 PInvoke 签名的调用约定和参…

C++qt-信号-信号槽

1、概念 信号和槽是两种函数&#xff0c;这是Qt在C基础上新增的特性&#xff0c;类似于其他技术中的回调的概念。 信号和槽通过程序员提前设定的“约定”&#xff0c;可以实现对象之间的通信&#xff0c;有两个先决的条件&#xff1a; 通信的对象必须都是从QObject类中派生出来…