Qt窗体背景绘图和图片显示篇

2023-10-29

今天重新研究Qt窗体绘图和图片显示

(1)窗体的背景上绘制线段和区域

(2)窗体背景显示图片以及图片缩放

(3)无边框窗体显示以及无边框窗体的移动

(4)自定义widget形状


(1) 在窗体上执行绘制线段和区域等操作

图1



有时候需要在窗体的背景上绘制一些直线或者对某个区域进行填充等操作,下面就详细说明这一操作的过程

在窗体重绘制是通过void test::paintEvent(QPaintEvent *pevent)方法进行重绘的,只是这个方法仅仅重新绘制

窗体的中心区域,图1是一个对窗体背景进行填充的一个图片,另外test窗体上还放置了一个QLabel,内容是"i am label 1"

看了效果图,我们在来分析这个实现过程.由于是要对窗体test的背景进行重绘,text窗体类是继承自class test : public QMainWindow,

默认状态下,test窗体调用基类QMainWindow的虚函数paintEvent进行重绘test窗体的中心区域,我们要改变test的中心区域,就需要

重新实现paintEvent方法,先将void paintEvent(QPaintEvent *)添加到test类的成员函数 ,

private: 
virtual void  paintEvent ( QPaintEvent * ) ;

具体代码如下:

void test::paintEvent(QPaintEvent *pevent)
{
	QPainter painter(this);
	QPen pen; //画笔
		pen.setColor(QColor(255,0,0));
		QBrush brush(QColor(255,0,0)); //画刷
		painter.setPen(pen); //添加画笔
		painter.setBrush(brush); //添加画刷
		painter.drawRect(0,0,this->width(),this->height()); //绘制矩形	
<span style="white-space:pre">		</span>painter.drawLine(0,0,30,30);
}


(2)窗体背景显示图片以及图片缩放

下面在看怎么把图片显示到窗体背景上

图2


使用QPixmap

void test::paintEvent(QPaintEvent *pevent)
{
	QPainter painter(this);
	QPixmap *pixmap=new	QPixmap(":test/Resources/shili2.png");	//注意是/而不是\
	painter.drawPixmap(pixmap->rect(),*pixmap);	

}

使用QImage

void test::paintEvent(QPaintEvent *pevent)
{
	QPainter painter(this);
	QImage *pimage=new QImage(":test/Resources/shili2.png");
	painter.drawImage(pimage->rect(),*pimage);

}

如果需要设置窗体背景的透明程度,我们在test的构造函数中这样处理

test::test(QWidget *parent, Qt::WFlags flags)
	: QMainWindow(parent, flags)
{
	ui.setupUi(this);
	this->setAttribute(Qt::WA_TranslucentBackground, true);//使能透明
	this->setWindowOpacity(0.5);//设置透明度
}

如果需要对QPixmap进行缩放显示的话可以这样

</pre><pre name="code" class="cpp">void test::paintEvent(QPaintEvent *pevent)
{
	QPainter painter(this);
	QPixmap *pixmap=new	QPixmap(":test/Resources/shili2.png");	//注意是	
	qDebug()<<"\npixmap w and h "<<pixmap->width()<<"  "<<pixmap->height()<<"\n";
	QPixmap pixmap2;
	pixmap2=pixmap->scaled(pixmap->width()/2,pixmap->height()/2,Qt::IgnoreAspectRatio);

	qDebug()<<"\npixmap w and h "<<pixmap2.width()<<"  "<<pixmap2.height()<<"\n";
	painter.drawPixmap(pixmap2.rect(),pixmap2);	

}

需要说明的是Qt中的scaled函数不是对对象本身进行缩放操作,也就是说这里pixmap->scaled不是对pixmap本身进行操作,

调用scaled后,pixmap本身不会改变,scaled返回一个缩放后的pixmap,同样QImage也有scaled方法,可以进行缩放操作


(3)无边框窗体显示以及无边框窗体的移动

在说明一下怎么让test窗体无边框窗口没有标题栏,默认拖拽窗体是没法移动窗口的,也就是不显示最大

化最小化这栏内容,这个做法很简单,这属于test的窗体属性那么我们可以在构造函数中指定窗体的属性,具体做法是修改ui生

成的构造函数声明部分的默认参数,生成的是这样:

public:
test(QWidget *parent = 0, Qt::WFlags flags = 0);

我们只需要修改成

public:
test(QWidget *parent = 0, Qt::WFlags flags =Qt::FramelessWindowHint);

修改后重新编译运行,截图如图3


图3

使用Qt::WFlags flags =Qt::FramelessWindowHint标志,会导致这个窗体不能移动,但还可以调节大小
实现无边框窗体的移动:
实现无边框窗体拖拽移动需要重写重写 mousePressEvent() 和 mouseMoveEvent() 虚函数.

示例代码如下,没有进行测试过

void test::mousePressEvent(QMouseEvent *event)
    {
        if(event->button() == Qt::LeftButton)
        {
            *dragPos_ = event->globalPos() - frameGeometry().topLeft();
            event->accept();
        }
    }
     
  void test::mouseMoveEvent(QMouseEvent *event)
  {
      if(event->buttons() & Qt::LeftButton)
      {
          move(event->globalPos() - *dragPos_);
          event->accept();
      }
  }
(4)自定义widget形状

自定义widget形状

widget类有个setMask方法,进行设置widget 显示的边界:void QWidget::setMask ( const QBitmap & bitmap )对QLabel的显示边界设定可以这样,

对 QPixmap获取QBitmap,可以使用QBitmap QPixmap::mask () const

 <span style="white-space:pre">	</span>QLabel topLevelLabel;
     <span style="white-space:pre">	</span>QPixmap pixmap(":/images/tux.png");
     <span style="white-space:pre">	</span>topLevelLabel.setPixmap(pixmap);
     <span style="white-space:pre">	</span>topLevelLabel.setMask(pixmap.mask());




本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt窗体背景绘图和图片显示篇 的相关文章

  • allegro如何对差分对单根网络进行等长调节

    选中要调整的差分线 再点击左栏的快捷按钮 此时options会弹出相关的调整s参数 设置好差分线参数 鼠标放在刚才选中的线上拉出一个方框 方框内就会显示线的形状变化 再次点击鼠标后 就会把线绘制成曲线形状 蛇形走线 在这里注意 如果调整走线
  • Redis缓存穿透, 击穿, 雪崩

    缓存穿透 缓存穿透是指用户想要查询一个数据 发现redis内存中没有 也就是没有缓存命中 于是向持久层数据库查询 发现也没有 于是本次查询失败 当用户很多的时候 缓存中都没有 于是都去请求持久层数据库 这会给持久层数据库造成很大压力 这就是
  • kafka 不支持读写分离的原因

    前段时间在看 kafka 相关内容 发现 kafka 所有的 读写流量都在主 partition 上 从 partition 只负责备份数据 那么为什么 kafka 从 partition 不跟其他中间件一样承接读流量 读写分离的初衷 读写
  • LoadRunner11 脚本关联操作-(学习中)

    一 首先了解关联的定义 服务器返回给客户端的是一些动态变化的值 客户端使用动态变化的值去访问服务器的时候 不能把这些值写死在脚本里面 而应该存放在一个变量里面 实时去获取服务器返回的动态值 简而言之 就是将录制脚本的静态值 再转换成动态值
  • 2021-1-30Linux学习纪要

    压缩和解压类 gzip gunzip gzip 用与压缩文件 gunzip 用于解压缩文件 特点把文件压缩之后原来的文件就没有了 同样的解压之后 压缩文件也没有了 zip 选项 xxx zip 将要压缩的内容 功能描述 压缩文件和目录的命令
  • 百川智能发布开源中英文大模型;GitHub调查显示92%的程序员使用AI编码工具;第一季度中国云服务支出增长6%丨每日大事件...

    数据智能产业创新服务媒体 聚焦数智 改变商业 企业动态 百川智能发布开源中英文大模型 6月15日 百川智能公司推出了70亿参数量的中英文预训练大模型 baichuan 7B baichuan 7B在C Eval AGIEval和Gaokao
  • 4.决策树

    决策树 一 决策树概述 训练阶段 根据训练数据构造决策树模型 在测试阶段 对数据进行分类 决策树重要的三个阶段 1 特征的选择 2 决策树的生成 3 决策树剪枝 决策树内部节点表示特征或者属性 叶节点表示类别 特征的选择 根据信息增益 ID
  • totimestamp mysql_mysql多个TimeStamp设置

    timestamp设置默认值是Default CURRENT TIMESTAMP timestamp设置随着表变化而自动更新是ON UPDATE CURRENT TIMESTAMP 但是由于 一个表中至多只能有一个字段设置CURRENT T
  • 使用websocket模拟一下发送和接收消息

    好的 下面是使用 WebSocket 模拟发送和接收消息的一些指导思路 在客户端和服务端之间建立 WebSocket 连接 客户端可以使用 JavaScript 的 WebSocket 对象来建立连接 服务端可以使用支持 WebSocket
  • 图像识别小车(PCB设计)——电赛学习笔记(4)

    学习来源 B站唐老师讲电赛 PCB设计极速入门 立创EDA ALTIUM DESIGNER 10 0PCB设计极速入门 立创EDA ALTIUM DESIGNER 10 0 哔哩哔哩 bilibili 一 设计过程 使用嘉立创EDA加Alt
  • 【初探DETR】UP-DETR 复现

    项目链接 https github com dddzg up detr 论文 https arxiv org abs 2011 09094 UP DETR 遵循两个步骤 预训练和微调 展示了在 ImageNet 上预训练的模型 然后在 CO
  • MOS管的使用方法

    转载自http blog csdn net qingwufeiyang12346 article details 48385773 http user qzone qq com 2756567163 1 三个极的判定 栅极 G 中间抽头 源
  • java 分布式日志_打造分布式日志收集系统

    前言 系统一大 就会拆分成多个独立的进程 比如web wcf web api等 也就成了分布式系统 要看一个请求怎么从头到尾走的 就有些困难了 要是进行DEBUG 跟踪 就更加麻烦了 困难程度要视进程多少而定 越多越复杂 分布式日志收集系统
  • Java工作线程 主存 同步机制_Java 并发变成同步机制

    并发编程的演进 批处理 多进程 多线程 在多线程变成中 由于多个线程共享进程的变量 有可能出现同时访问一个资源的情况 因此需要使用同步机制 java的内存模型 Java内存模型规定所有的变量都存在主存当中 每个线程都有自己的工作内存 线程对
  • netty5学习笔记-内存池4-PoolArena

    前面我们讲到了内存池中的几个重要的类 1 PoolChunk 维护一段连续内存 并负责内存块分配与回收 其中比较重要的两个概念 page 可分配的最小内存块单位 chunk page的集合 2 PoolSubpage 将page分为更小的块
  • Node.js通过js_code获取微信小程序的session_key和openid

    前言 小程序自己写一个node后台服务来接收前段的code 访问微信后台获取他的session key和openid const url require url const http require http const request r
  • 【go】Unmarshal时候报错提示proto.Unmarshal: missing method ProtoReflect

    问题 使用proto Unmarshal报错 提示以下信息 cannot use promoRule variable of type db PromotionRuleSet as protoreflect ProtoMessage val
  • 【WebStorm学生认证】如何用学生邮箱进行JetBrains学生认证

    前言 用邮箱进行学生认证 为期一年 到期再次进入官网续期即可 1 进入JetB rains官网 会看到右侧有个白色小人图案 点进去登录 注册 如果没有账号 如下图所指位置 注册一个 注意 采用学生邮箱 edu 邮箱 进行注册 有账号直接登录
  • Apollo自动驾驶系统概述——传感器技术(文末参与活动赠送百度周边)

    前言 作者主页 雪碧有白泡泡 个人网站 雪碧的个人网站 推荐专栏 java一站式服务 React从入门到精通 前端炫酷代码分享 从0到英雄 vue成神之路 uniapp 从构建到提升 从0到英雄 vue成神之路 解决算法 一个专栏就够了 架

随机推荐

  • 独家定制来了!免费帮你生成专属你的卡通头像!

    在如今的互联网时代 无论是哪个平台 都会使用到头像 你最喜欢用哪种头像 为满足大家的少男少女之心 皮卡智能最新研发了一款新的卡通头像风格 Q版卡通头像 可爱到像是定制绘画出来的 话不多说 直接上效果吧 原图 原图 原图 无论你是大叔还是萝莉
  • 放大电路中的反馈(电压串联负反馈,电流串联负反馈,电压并联负反馈,电压并联负反馈)

    放大电路中的反馈 反馈的判断 反馈的存在与否 从结构上判断 结构上存在一个通路 关系上存在一个反馈量 图a 从结构来讲不存在一个通路 图b 从结构来讲存在一个通路 从关系来讲 将Ui置零 输入反向端出现了一个R1 R1 R2 Uo这样一个信
  • 王垠——想得太多,做得太少

    我大四的时候 读到王垠从清华退学的文章 当时我虽然还没有正式开始攻读博士学位 但是也在实验室待了一年多了 老油条一根 对清华的博士生的学习生活了解得差不多了 当时读王垠的文章 我开始很不解 就剩一年 何不再坚持一下呢 后来我了解到一个人不能
  • GBase 8s 的四种运行模式

    1 离线模式 不能执行任何操作 2 在线模式 可以执行各种操作 3 单用户模式 可以执行SQL操作和命令行维护操作 只能管理员 GBASEDBT DBSA 连接 其它普通用户不能连接 4 静态模式 只能执行命令行维护操作 如备份数据库
  • 常用SQL语句-Part1

    1 向某个数据表中 增加一列 Oracle Alter Table table name Add column name colomn type Commit Sql Server Alter Table table name Add co
  • 超级实用的shell脚本100例(一)

    超级实用的shell脚本100例 一 1 编写 hello world 脚本 bin bash echo hello world 2 通过位置变量创建 Linux 系统账户及密码 bin bash 1 是执行脚本的第一个参数 2 是执行脚本
  • Android 简介

    国内移动互联网发展史 播种 2000年9月19日 中国移动和国内百家ICP首次坐在了一起 日本取经 2001年11月10日 中国移动通信的 移动梦网 正式开通 萌芽 萌芽时期 先后冒出了搜索 音乐 阅读 游戏等领域的多种无线企业 不过 整个
  • Visual Studio修改代码后运行程序不更新问题解决方案

    一 在生成中重新生成 但是此方法需要每次修改后重新点击 二 配置生成管理器 路径 生成 配置管理器 勾选 生成 刚学visual studio 2022 3天 自己摸索出来的方案
  • 福布斯发布区块链50强 这5家中国公司上榜

    福布斯发布区块链50强 这5家中国公司上榜 附榜单 福布斯今日 2月20日 在官网发布第二届 区块链50强 Blockchain 50 榜单 据福布斯评选标准 入选 Blockchain 50 榜单的公司必须每年营收不少于10亿美元或估值超
  • 欧拉角 图解释

    定义 先引wiki上的定义 欧拉角 由三个角度组成 在特定坐标系下用于描述刚体的orientation 简单来说 就是绕一个三维坐标系统下的三个基轴旋转三个角度 可以用来表示物体通过各种绕七绕八的转 最终转到的那种形态 orientatio
  • wifi类物联产品配网之web

    文章目录 wifi类物联产品配网之web web配网介绍 web配网实现 wifi类物联产品配网之web 上接wifi类物联产品配网前言 web配网介绍 web主要连接设备建立的wifi 热点后 以网页的形式 让用户输入wifi ssid和
  • Mybatis

    1 简介 1 1 持久化 数据持久化 持久化就是将程序的数据在持久状态和瞬时状态转换的过程 内存 断电即失 数据库 Jdbc io文件持久化 为什么需要持久化 有些对象 不能让他丢掉 内存太贵了 1 2 持久层 Dao层 Service层
  • LLM-大模型训练-步骤(二)-预训练/Pre-Training(1):全参数预训练(Full-Param Pre-Training)【对LLaMA等模型进一步全量参数预训练】【中文无监督学习语料】

    GitHub项目 KnowLM 一 全参数预训练 Full Param Pre training 使用中文语料对LLaMA等模型进行进一步全量预训练 在尽可能保留原来的英文和代码能力的前提下 进一步提高模型对于中文理解能力和丰富模型的知识储
  • moveToThread的最简单用法(依葫芦画瓢即可)(使得线程也更偏向于信号槽的使用方法)

    file main cpp Copyright C 2010 dbzhang800 All rights reserved include
  • 蓝桥杯2015年第六届真题-奇怪的数列

    题目 题目链接 题解 实现题 太简单了 就是遍历字符串 拼接一下就可以了 代码 include
  • Jvm参数优化

    Jvm参数优化 背景 1 系统上线规划容量 分析 2 垃圾回收器选择 吞吐量和响应时间 垃圾回收器选择 3 规划各个分区的比例大小 4 对象年龄对少移动到老年代合适 5 对象多大放到老年代 6 垃圾回收器CMS老年代参数优化 7 配置OOM
  • 更换硬盘_「心得」群晖NAS升级硬盘——硬盘篇:硬盘的更换与RAID设置思路

    经过大概一周左右的时间 终于断断续续的把我的群晖NAS的硬盘升级完了 把原来3TB 2的RAID 1 变成3TB 3的RAID 5 同时把额外单独的3TB冷备份硬盘 也升级成了6TB 为什么花费了一周左右的时间 当中包括前期的文件校验 新硬
  • C#中的多线程 - 并行编程

    转载至 https blog gkarch com threading part5 html 1并行编程Permalink 在这一部分 我们讨论 Framework 4 0 加入的多线程 API 它们可以充分利用多核处理器 并行 LINQ
  • 宝塔部署nodejs接口项目及mysql数据库教程

    上传项目文件至宝塔目录文件夹 我这里上传的server文件 在网站菜单添加node项目 填写node项目信息 项目端口需要填写项目真实的启动端口 需要绑定域名的可以添加域名管理 添加域名后需要开启外网映射 新建mysql数据库 导入数据库数
  • Qt窗体背景绘图和图片显示篇

    今天重新研究Qt窗体绘图和图片显示 1 窗体的背景上绘制线段和区域 2 窗体背景显示图片以及图片缩放 3 无边框窗体显示以及无边框窗体的移动 4 自定义widget形状 1 在窗体上执行绘制线段和区域等操作 图1 有时候需要在窗体的背景上绘