零基础开始QT绘图(6)

news2024/11/19 10:32:41

前面我们开始提到了GraphicView的使用,也提到GraphicsItem的使用,并且开始了自定义GraphicsItem的编写,而且上次我们的GraphicsItem也是可以拖动了,但这离我们需要的效果还有一定的距离。
所以,这次,我们进一步优化它,主要在这两个方面

1、选择样式

我们想在鼠标选择的时候不显示那个虚线框,而是我们自定义的其他样式,比如点选的时候带黄色蒙版的样式。如下图效果:
在这里插入图片描述
很明显,我们可以看到自定义的myitem选中后的样式已经明显与众不同了。如何做到呢?上代码:

void buttonGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)  {
  Q_UNUSED(widget)
    QStyleOptionGraphicsItem op;

 painter->setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing|QPainter::SmoothPixmapTransform);
    QRectF recf=boundingRect();
    QRectF board=QRectF(0,-2,120,40);
    QPen pen(Qt::red);
    QColor clr=QColor(Qt::blue);
    clr.setAlpha(20);
    QBrush brush(clr);
    painter->setPen(pen);
    painter->setBrush(brush);
    painter->drawRoundedRect(board,10,10);

    painter->setPen(QPen(Qt::black));
    if(!m_title.isEmpty())
        painter->drawText(QPointF(board.center().rx()-16,board.center().ry()+4),m_title);

    // 选中时绘制
    if (option->state & QStyle::State_Selected) {
       qreal itemPenWidth = pen.widthF();
       const qreal pad = itemPenWidth / 2;
       
       // 绘制实线
       painter->setPen(Qt::NoPen);//QPen(color, penWidth, Qt::SolidLine)
       painter->setBrush(Qt::NoBrush);
       painter->drawRect(recf.adjusted(pad, pad, -pad, -pad));

       //绘制透明遮盖层
        QColor clor=QColor(Qt::yellow);
        clor.setAlpha(25);
        QBrush brusher(clor);
        painter->setBrush(brusher);
        painter->drawRect(recf.adjusted(pad, pad, -pad, -pad));
           }
   }

其实只需要在我们已经定义好的graphicsitems中重写paint。在里面按照boundingRect()的大小来绘制一个透明度小于100的rect即可。
这里要注意,item的正常显示的图形是比boundingRect()要小,这个量是要预留出来的。我这里的board就是比boundingRect()内缩了20个单位的item绘图区域。

2、文字输入

我们如果想让我们的items都有文字输入功能怎么办呢?在上面的代码中我们已经看到了绘制文字的语句,关键是如何接受到外面来的文字:

 painter->setPen(QPen(Qt::black));
    if(!m_title.isEmpty())
        painter->drawText(QPointF(board.center().rx()-16,board.center().ry()+4),m_title);

我的思路是这样的,也许你们会有更好的思路,首先实现item的mouseclick 通过doubleclick,双击后捕获它,弹出对话框修改它。(当然,你也可以将文字修改问graphicsTextitems,通过焦点捕获来实现,看起来更直观,这个在后面的博文中会有这种实现方式),我们来看看效果:
在这里插入图片描述
关键代码(重写双击函数):

void  buttonGraphicsItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event){

    bool ok;
    QString strlabel=QInputDialog::getText(nullptr,"input label","please input the label text:",QLineEdit::Normal,"myItem",&ok);
    if (ok && !strlabel.isEmpty())
         m_title =strlabel;

     QGraphicsItem::mouseDoubleClickEvent(event);
}

这里的m_tiltle是在头文件中声明的一个存储label的变量。

接下来,我们可能会有更多的需求,比如做一个简单的组态软件,我们后面可能就用用到GraphicsScene了,下篇博文我们就会从了解它开始。

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

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

相关文章

工程电磁设备在2018年杭州电磁大会的报告

1 方法原理 本篇是对多频电磁方法,应用的解读。 本汇报讲述了EMI传感器的基本情况,以及用手持多频电磁仪进行实际探测应用的例子。 什么是电磁感应?用发射装置(TX)激发谐波,产生一次场(Primary field),地下导体目标会相应产生涡流电磁场,产生二次场,被接收装置(RX…

「网络安全渗透」如果你还不懂CSRF?这一篇让你彻底掌握

1 什么是 CSRF 面试的时候的著名问题:"谈一谈你对 CSRF 与 SSRF 区别的看法" 这个问题,如果我们用非常通俗的语言讲的话,CSRF 更像是钓鱼的举动,是用户攻击用户的;而对于 SSRF 来说,是由服务器…

14.0、Linux-yum方式安装 docker

14.0、Linux-yum方式安装 docker 第一步: 检测 CentOS7 -> cat /etc/redhat-release 第二步: 用以下命令安装准备环境 -> yum -y install gcc yum -y install gcc-c 第三步: 如果之前安装过 docker 的,先用以下命令删…

【每日一题】【LeetCode】【第十三天】移动零

解决之路 题目描述 测试案例(部分) 第一次 看到这题目,第一时间还真想到了双指针法(暴力解法是个会写代码的都能第一时间想到,所以自己学会了尽量不第一时间用暴力解法) right的初始位置元素若为0&…

Jenkins-Slave分布式架构搭建

♥ Jenkins的分布式构建,在Jenkins的配置中叫做节点,分布式构建能够让同一套代码或项目在不同的环境(如:Windows和Linux系统)中编译、部署等。 ♥ 将jenkins项目发布在不同服务器上(分布jenkins工作空间,部署项目到不同…

java 简单了解spring之(IOC容器)

IOC 容器 是spring的一个重要组成部分 IOC 翻译过来叫控制反转 他在做的事是 降低计算机代码的耦合度 这个过程叫IOC 通过控制反转 对象在被创建时 由一个调控系统内所有对象的外界实体将将其所依赖的对象引用传递给他,也可以说,依赖被注入到对象中 说简…

[oeasy]python0048_取整_int_float_浮点型_cast_扮演_tab_制表键_制表符

转化为10进制 回忆上次内容 上次 把其他进制 转化回 十进制 用的是 int 函数 int 来自于 integer 同源词 还有 integrateentire意思都是完整的 完整的 和 零散的 相对 可以把 零散的小数 转化为 完整的整数吗?🤔 取整 可以 把一个浮点型的小数 取…

【Proteus仿真】【51单片机】酒精浓度检测系统设计

文章目录一、功能简介二、软件设计三、实验现象联系作者一、功能简介 本项目使用Proteus8仿真51单片机控制器,使用LCD1602显示模块、按键模块、LED和蜂鸣器、MQ-3酒精传感器模块等。 主要功能: 系统运行后,LCD1602显示酒精浓度值和阈值&…

【自学Docker】Docker命令

Docker命令 Docker命令分类 Docker环境信息 docker [info|version]Docker容器生命周期管理 docker [create|exec|run|start|stop|restart|kill|rm|pause|unpause]Docker容器操作运维 docker [ps|inspect|top|attach|wait|export|port|rename|stats]Docker容器rootfs命令 …

AMBA--AHB总线协议学习及Verilog实现与仿真(一)

1、AHB总线概述 AHB:Advanced High-performance Bus,即高级高性能总线。AHB总线是SOC芯片中应用最为广泛的片上总线。下图是一个典型的基于AMBA AHB总线的微控制器系统: 基于AMBA AHB的设计中可以包含一个或多个总线主机,通常一个系统里至少…

MySQL——如何正确的显示随机消息

在之前的文章中有介绍order by语句的几种执行模式。考虑如下场景:有一个APP,有一个随机显示英语单词的功能,也就是根据每个用户的级别有一个单词表,然后这个用户每次访问首页的时候,都会随机滚动显示三个单词。会发现随…

PhotoZoom2023专业的图片无损放大软件最新V8版功能介绍

PhotoZoom 8 全新版本 震撼来袭。 一款划时代的、技术上产生革命性影响的数码图片放大工具。 我们获取图片的方法,一般是从度娘图片和各个图库里找素材。但一般网上搜索到的很多图片像素都非常小,普通方法放大就像打了马赛克一样,根本没法直接…

基于STM32的室内环境监测系统、基于STM32的智能家居系统

程序源码无删减 整个开发用到的所有资料如下: 开发软件MDK JLINK驱动安装包及相关文件 stm32开发资料-stm32f103c8t6 PCtoLCD2002 取模软件 stm32配套的液晶屏资料以及相关程序 Stm32f103c8t6 UCOSII 各传感器的数据手册以及程序、BMP180、DHT11温度模块、HC-SR04 …

EthernetOnTCP--基于Qt QSslSocket 套接字在PCAP 集线器上实现以太网隧道

在上一篇文章中,我们使用PCAP建立了本地的软件集线器(Hub)。考虑到较远距离的跨车间调试,有必要使用Tcp连接构造一个以太网的隧道,使得两个车间之间的调试设备可以虚拟的连接在一个Hub上。当然,我们可以使用…

【ROS】—— 机器人系统仿真 —Rviz中控制机器人模型运动与URDF集成Gazebo(十五)

文章目录前言1. Arbotix使用流程1.1 安装 Arbotix1.2 创建新功能包,准备机器人 urdf、xacro 文件1.3 添加 Arbotix 配置文件1.4 编写 launch 文件配置 Arbotix1.5 启动 launch 文件并控制机器人模型运动2. URDF集成Gazebo2.1 URDF与Gazebo基本集成流程2.2 URDF集成G…

Spring Boot整合Redis(gradle + gson + lombok + redisTemplate)

本文创建了gradle项目,用来整合Spring Boot和Redis,用到了gradle gson lombok redisTemplate等技术。 重要文件: 文件名说明build.gradlegradle配置文件Redis2Application.java启动类Controller.java控制器类StudentService.java业务逻辑…

深入解析Linux虚拟化KVM-Qemu分析之virtio设备

说明: KVM版本:5.9.1QEMU版本:5.0.0工具:Source Insight 3.5, Visio 1. 概述 先来张图: 图中罗列了四个关键模块:Virtio Device、Virtio Driver、Virtqueue、Notification(eventfd…

Linux——简单了解文件与目录结构

1、 Linux 文件 1.1 概述 Linux系统 一切皆文件。 从我们刚接触到Linux系统,就能听到这句话:Linux系统 一切皆文件。 我们来看看Linux文件系统和Windos的差异: Windows ,我们知道一台新的电脑到手之后,往往都只有一…

Vue2的双向绑定真的就是观察者模式吗?

导语建议先看看往期的推文,对vue响应式有一定理解后再阅读本文。Vue的双向绑定(数据劫持)响应式与观察者模式(特别是附录,观察者模式与发布订阅模式)关于Vue2深入响应式原理,作者原话为&#xf…

搭建nacos环境(保姆级教程)

2.2.1 服务发现中心 根据上节讲解的网关的架构图,要使用网关首先搭建Nacos。 首先搭建Nacos服务发现中心。 在搭建Nacos服务发现中心之前需要搞清楚两个概念:namespace和group namespace:用于区分环境、比如:开发环境、测试环…