(一)Qt 将某控件、图案绘制在最前面的方法,通过QGraphicsScene模块实现

news2024/11/24 17:40:05

系列文章目录

通过Qt实现手势识别控制软件操作相关系列技术方案

(一)Qt 将某控件、图案绘制在最前面的方法,通过QGraphicsScene模块实现
(二)Qt QGraphicsScene模块实现圆点绘制在所有窗体的最前方,实现圆点的“彩色拖尾”效果以及“选中方框”效果
(三)Qt 动态手势识别“握拳”
(四)Qt 动态手势识别“手掌随动”+“握拳选择”
(五)Qt 动态手势识别“左右滑动”以及实现翻页效果

文章目录

  • 系列文章目录
  • 前言
  • 一、效果
  • 二、代码实现
    • 1.工程文件夹结构
    • 2.BackWidget类
      • 2.1 backwidget.h
      • 2.2 backwidget.cpp
  • 总结


前言

  在用Qt做一些应用的时候,有可能遇到和“绘制顺序”相关的问题,即要控制一些控件之间的显示前后问题,在常用的QWidget体系中,设置前后位置是主要是通过raise(),underStack(),hide()函数,但这种操作对本人遇到的问题可能不太好办。
  本人需要处理的问题,可以直接看本博客的图1的效果,即“实现有一个黑点在八个黄色的QWidget子部件前方自由移动”的效果,黑点要完全在黄色方块之前出现。
  如果按照常规对当前的QWidget对象重写paintEvent函数的做法,去绘制那个黑点,那么可能会得到图2的效果。
  本文要做的是去实现图1而不是图2的效果。


一、效果

  为了简便演示,本人在ui文件中直接布置8个方块,为了说明一些问题,左边四块方块为完全不透明的方块,右边四块方块为半透明方块。
图1

图1 黑点完全在黄色框上方绘制

图2

图2 黑点在黄色框下方绘制

二、代码实现

1.工程文件夹结构

  本项目工程结构如下图,和显示相关的类如下:一个Widget界面类用于最底层的容器,一个BackWidget界面类用于实现业务逻辑代码。BackWidget占据Widget的整幅界面。
在这里插入图片描述

  这里还有一个UdpServer类是用来确定“黑色圆点”的当前位置的,与显示问题没有直接关系,因此本篇博客不展开详细说明,有兴趣的博友可以移步此篇博客。
代码如下(示例):

2.BackWidget类

2.1 backwidget.h

#ifndef BACKWIDGET_H
#define BACKWIDGET_H

#include <QWidget>
#include <QPainter>
#include <QDebug>
#include <QGraphicsScene>
#include <QGraphicsEllipseItem>
#include <QGraphicsView>

namespace Ui {
class BackWidget;
}

class BackWidget : public QWidget
{
    Q_OBJECT

public:
    explicit BackWidget(QWidget *parent = nullptr);
    ~BackWidget();

    void paintEvent(QPaintEvent *event);
    void draw_point(QPainter& painter, const QPointF& point);
    void draw_point(const QPointF& point);

    void showEvent(QShowEvent* event);
    void resizeEvent(QResizeEvent* event);

    QGraphicsScene* scene;
    QGraphicsEllipseItem* circleItem;
    QGraphicsView* view;

public slots:
    void point_update(QList<QPointF>* points);

private:
    Ui::BackWidget *ui;
    QList<QPointF>* pointsInWidget;
};

#endif // BACKWIDGET_H

2.2 backwidget.cpp

  对绘制黑点这块,通过修改输入参数的形式实现函数的重载(方式比较简单,没仔细考虑,介意的人可以自己改函数名称),下面两个函数,只能运行一条,另一条注释掉。

	//QWiget方式绘制
    draw_point(painter, point);
    
	//用QGraphicsScene方式绘制
    draw_point(point);
#include "backwidget.h"
#include "ui_backwidget.h"

BackWidget::BackWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::BackWidget)
{
    ui->setupUi(this);
    pointsInWidget = new QList<QPointF>;


    scene = new QGraphicsScene(this);
    circleItem = new QGraphicsEllipseItem;
    scene->addItem(circleItem);

    view = new QGraphicsView(scene, this);
    view->setGeometry(0, 0, width(), height());
    view->setStyleSheet("background: transparent");
    view->setRenderHint(QPainter::Antialiasing);
    view->setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
}

BackWidget::~BackWidget()
{
    delete ui;
}


void BackWidget::point_update(QList<QPointF>* points)
{
    delete pointsInWidget;
    pointsInWidget = new QList<QPointF>(*points);
    delete points;

    update();
}


void BackWidget::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event)

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing, true);

    uint i =0;
    for (const QPointF& point : *pointsInWidget)
    {
        if(i==9)
        {	
        	//QWiget方式绘制
            draw_point(painter, point);
            
			//用QGraphicsScene方式绘制
            draw_point(point);
        }

        i++;
    }
}


void BackWidget::showEvent(QShowEvent* event)
{
    QWidget::showEvent(event);
    view->show();
}

void BackWidget::resizeEvent(QResizeEvent* event)
{
    QWidget::resizeEvent(event);
    view->setGeometry(0, 0, width(), height());
}


void BackWidget::draw_point(const QPointF& point)
{
    circleItem->setRect(QRectF(point.x() * width() - 15, point.y() * height() - 15, 80, 80));

    QBrush brush(Qt::black);
    circleItem->setBrush(brush);
    scene->update();
}


void BackWidget::draw_point(QPainter& painter, const QPointF& point)
{
    painter.setBrush(QBrush(Qt::black));
    painter.drawEllipse(QPointF(point.x()*width(),point.y()*height()), 40, 40);
}


总结

  本文为,Qt 将某控件、图案绘制在最前面的方法,通过QGraphicsScene模块实现的方法。
  系列文章:
(一)Qt 将某控件、图案绘制在最前面的方法,通过QGraphicsScene模块实现
(二)Qt QGraphicsScene模块实现圆点绘制在所有窗体的最前方,实现圆点的“彩色拖尾”效果以及“选中方框”效果
(三)Qt 动态手势识别“握拳”
(四)Qt 动态手势识别“手掌随动”+“握拳选择”
(五)Qt 动态手势识别“左右滑动”以及实现翻页效果
  本系列文章所有代码获取请与本人私信联系。

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

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

相关文章

深度学习100例 | 第37天:表情识别(K同学啊原创出品)

&#x1f3e1; 我的环境&#xff1a; 语言环境&#xff1a;Python3.10.11编译器&#xff1a;Jupyter Notebook深度学习框架&#xff1a;TensorFlow2.4.1显卡&#xff08;GPU&#xff09;&#xff1a;NVIDIA GeForce RTX 4070 &#x1f942; 相关教程&#xff1a; 编译器教程&…

「2024」预备研究生mem-比与比例(下)

一、比与比例&#xff08;下&#xff09; 好方法&#xff1a; 不错 二、课后题 三、每日一练

10 月发布,Ubuntu 23.10 已升级到 Linux Kernel 6.3 内核

导读Canonical 于近日宣布&#xff0c;代号为 Mantic Minotaur 的 Ubuntu 23.10 发行版本已升级基于 Linux Kernel 6.3 内核。 Canonical宣布&#xff0c;代号为 Mantic Minotaur 的 Ubuntu 23.10 发行版本已升级基于 Linux Kernel 6.3 内核。 Ubuntu 23.10 于今年 4 月下旬进入…

6、Redis事务、管道、发布订阅(了解)

1、Redis事务 是什么&#xff1f; 可以一次执行多个命令&#xff0c;本质是一组命令的集合。一个事务中的所有命令都会序列化&#xff0c;按顺序地串行化执行而不会被其它命令插入&#xff0c;不许加塞 一个队列中&#xff0c;一次性、顺序性、排他性的执行一系列命令 Redis…

【C51】基于51单片机无线遥控门铃电路的设计与实现

摘 要 20世纪以来&#xff0c;科技发展步入了信息时代&#xff0c;科技发展的目的就是为了服务人民&#xff0c;让我们可以拥有更好的生活。居住环境和质量也愈加重要&#xff0c;智能家居就是一次革新&#xff0c;给生活方面带来了巨大的改善&#xff0c;本课题研究的无线遥控…

C#核心知识回顾——4.object中的方法、String、StringBuilder

1.object中的方法 object中的静态方法&#xff1a; 静态方法Equals判断两个对象是否相等&#xff1a; 最终的判断权&#xff0c;交给左侧对象的Equals方法&#xff0c; 不管值类型引用类型都会按照左侧对象Equals方法的规则来进行比较 静态方法Reference Equals&#xf…

分布式操作系统期末复习(辽宁大学王龙主讲)

目录 一、题目 1.1 简答题 1.2 综合题 二、题目答案 2.1 简答题目答案 2.2 综合题目答案 三、期末题型分值分布 3.2 题型和分值 一、题目 1.1 简答题 1什么是中间件 22.1&#xff08;22年期末考试第一题&#xff09; 2 什么是名称解析 3 描述一下客户和服务器之间使…

爬虫入门指南(1):学习爬虫的基础知识和技巧

文章目录 爬虫基础知识什么是爬虫&#xff1f;爬虫的工作原理爬虫的应用领域 爬虫准备工作安装Python安装必要的库和工具 网页解析与XPath网页结构与标签CSS选择器与XPathXpath 语法XPath的基本表达式&#xff1a;XPath的谓语&#xff08;Predicate&#xff09;&#xff1a;XPa…

实测视频!为什么独立比贴片IMU更适合智能驾驶?

在汽车智能化这场行业变革中&#xff0c;作为智能驾驶的标配&#xff0c;高精度定位系统已成L2级及以上智能驾驶“照进现实”进程中四两拨千斤的存在。 惯性测量单元IMU因其工作不依赖包括卫星在内的外界信号&#xff0c;已是智能汽车高精度定位系统的核心元器件。然而行业对于…

2023年跨境物流行业研究报告

第一章 行业概况 跨境物流行业是指那些提供将货物从一个国家运输到另一个国家的服务的公司。这些服务可能包括运输、仓储、包装、分拣、清关和货物跟踪等。跨境物流行业是全球贸易的重要组成部分&#xff0c;它使得商品可以从生产地运输到全球各地的消费者手中。 图 物流运输…

Nmap命令使用

该命令可以扫描目标地址所开放的端口地址&#xff0c;nmap 扫描器主要基本功能有三个&#xff0c;一是探测主机是否在线、其次是扫描主机端口、嗅探所提供的网络服务&#xff0c;还可以推断主机所用的操作系统。也可以深入探测 UDP 或者 TCP 端口&#xff0c;直至主机所使用的操…

华为项目管理认证--东方智慧,能力革新︱华为全球培训中心项目管理认证资深架构师张全军

华为全球培训中心项目管理认证资深架构师张全军先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;华为项目管理认证——东方智慧&#xff0c;能力革新。大会将于8月12-13日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&…

Windows上安装Redis教程

Windows上安装Redis教程 一、下载 Redis1. 下载 Redis 压缩包2. 把下载好的压缩包移动到自己的安装目录下 二、安装 Redis三、配置 Redis3.1 配置 Redis 环境变量3.2 配置 Redis 后台服务 一、下载 Redis 1. 下载 Redis 压缩包 我这里下载的是 Redis 5.0 下载地址&#xff1a;…

6.30黄金双线收官打响保卫战,今日多空如何布局?

近期有哪些消息面影响黄金走势&#xff1f;今日黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;金价周四收复盘中部分失地&#xff0c;在一系列强劲美国经济数据推动金价短暂跌破1900美元关键心理位后&#xff0c;投资者逢低买入。美国上周初请失业金人数创20个…

Python 基本数据类型(三)

文章目录 每日一句正能量数值运算数值类型实例String&#xff08;字符串&#xff09; 每日一句正能量 人的相处&#xff0c;靠的是真心&#xff0c;不是套路。合得来的人&#xff0c;坦诚相待&#xff0c;合不来的人&#xff0c;客气寒暄&#xff1b;谁也别给谁冷脸看&#xff…

文章ACCEPT之后填写内容教程-Springer-Verlag即施普林格

目录 确认通讯作者邮箱或者直接登录您的投稿官网进行确认 有的大学机构是能免费出版的&#xff1a;清华&#xff0c;北大都行 缴纳APC和订阅模式的区别 签订出版协议 英文的作者顺序是没有先后的&#xff0c;后期校稿自己可以调节 选择不彩印&#xff1a;彩印费用也是比较…

来自我的B站数码up主推荐

本人在什么值得买发过&#xff0c;现在只不过是为了让账号看起来更丰盈一点&#xff0c;现在再发一次。 我写下这篇文章的目的&#xff0c;就是陶冶情操啦 首先此文章只代表个人观点&#xff0c;我的想法是比较喜欢数码&#xff0c;所以下我们可以从以下入手。 科技美学&…

华为OD机试真题 Python 实现【基站维修工程师】【2023Q1 200分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、Python算法源码六、效果展示1、输入2、输出 一、题目描述 小王是一名基站维护工程师&#xff0c;负责某区域的基站维护。 某地方有n个基站&#xff08;1<n<10&#xff09;&#xff0c;已知各基站之间的距离s…

C++ 异常处理

异常是程序在执行期间产生的问题。C 异常是指在程序运行时发生的特殊情况&#xff0c;比如尝试除以零的操作。 异常提供了一种转移程序控制权的方式。C 异常处理涉及到三个关键字&#xff1a;try、catch、throw。 throw: 当问题出现时&#xff0c;程序会抛出一个异常。这是通…

运动新风尚,听歌不用线——南卡OE真无线骨传导耳机

以往在选择运动耳机时&#xff0c;通常会选择骨传导耳机&#xff0c;骨传导耳机有着传统入耳式耳机以及头戴式耳机所不具备的优势。例如在运动稳定性以及安全性方面&#xff0c;骨传导耳机则更胜一筹&#xff0c;它在使用时&#xff0c;双耳是开放的&#xff0c;首先它不会有传…