Qt界面优化——绘图API

news2024/10/2 2:35:59

文章目录

    • 绘图核心API
    • 绘制各种形状
      • 绘制线段
      • 绘制矩形
      • 绘制圆形
      • 绘制文本
      • 设置画笔
      • 设置画刷
    • 绘制图片

绘图核心API

Qt的各种控件,本质上都是画出来的,这不过这些都是提前画好了,我们拿过来直接使用即可。

实际开发中,可能现有控件无法满足要求,需要自己画一个,所以Qt通过了画图API解决这个问题。

大多数场景无需自己画。

说明
QPainter“绘画者”
用来绘图的对象,提供一系列drawXXX方法,允许我们绘制各种图像
QPaintDevice“画板”
描述了QPainter`把图形画到哪个对象上
(QWidget就是QPaintDevice的子类)
QPen“画笔”
描述QPainter画出的线是什么样的
QBrush“画刷”
描述了QPainter填充一个区域是什么样

Tips:

画图相关操作,一般不会放到QWidget的构造函数中调用执行,而是Qt提供了一个paintEvent事件处理函数,在这里面调用。

有一个paintEvent对应的QPaintEvent事件:

  • 控件首次创建
  • 控件被遮挡,再解除遮挡
  • 窗口被最小化,再还原
  • 控件大小发生改变
  • 主动在代码中调用repaintupdate触发事件(都是QWidget提供的成员函数)

绘制各种形状

绘制线段

定义在栈上,无需考虑释放问题

此处指定的this,不是父对象,而是指定绘制的设备

void Widget::paintEvent(QPaintEvent *event)
{
    (void)event;
    //绘图工作在这个函数执行

    QPainter painter(this); //定义在栈上
    painter.drawLine(20, 20, 200, 20);
    painter.drawLine(QPoint(20,100), QPoint(200, 100));
}

image-20241001215322962

绘制矩形

void Widget::paintEvent(QPaintEvent *event)
{
    (void)event;
    //绘图工作在这个函数执行
    QPainter painter(this); //定义在栈上
    painter.drawRect(100, 100, 300, 200);
}

image-20241001215303359

绘制圆形

void Widget::paintEvent(QPaintEvent *event)
{
    (void)event;
    //绘图工作在这个函数执行

    QPainter painter(this); //定义在栈上
    painter.drawEllipse(200, 200, 100, 100);
}

image-20241001215523308

绘制文本

此处的横坐标表示文字最左侧的位置;纵坐标表示文字的基线位置

image-20241001220054554

void Widget::paintEvent(QPaintEvent *event)
{
    (void)event;
    //绘图工作在这个函数执行

    QPainter painter(this); //定义在栈上
    painter.drawText(100, 100, "hello world");
}

设置画笔

画笔风格:

image-20241001220336371

void Widget::paintEvent(QPaintEvent *event)
{
    (void)event;
    //绘图工作在这个函数执行

    QPainter painter(this); //定义在栈上

    QPen pen;
    //设置红色画笔
    pen.setColor(QColor(255, 0, 0));
    //设置线条粗细
    pen.setWidth(5);
    //设置线条风格
    pen.setStyle(Qt::DashLine);

    //painter对象使用画笔
    painter.setPen(pen);

    painter.drawEllipse(200, 200, 100, 100);
}

image-20241001220549978

设置画刷

画刷格式:

image-20241001220747026

void Widget::paintEvent(QPaintEvent *event)
{
    (void)event;
    //绘图工作在这个函数执行

    QPainter painter(this); //定义在栈上

    QPen pen;
    //设置红色画笔
    pen.setColor(QColor(255, 0, 0));
    //设置线条粗细
    pen.setWidth(5);
    //设置线条风格
    pen.setStyle(Qt::DashLine);

    //painter对象使用画笔
    painter.setPen(pen);

    //
    QBrush brush;
    //填充颜色
    brush.setColor(QColor(0, 255, 0));
    //填充风格
    brush.setStyle(Qt::SolidPattern);
    painter.setBrush(brush);

    painter.drawEllipse(200, 200, 400, 100);
}

image-20241001221054716

绘制图片

最常用QPixmap类,表示一个图片。

void Widget::paintEvent(QPaintEvent *event)
{
    (void)event;
    QPainter painter(this);
    QPixmap pixmap(":/ts.jpg");
    //基础绘制
    painter.drawPixmap(0, 0, pixmap);
}

image-20241001221642568

图片缩放:

//图片缩放  400*300
painter.drawPixmap(100, 100, 400, 300, pixmap);

image-20241001221821941

图片旋转:

本质是将QPainter对象进行旋转,绘制出的内容也就旋转了

rotate(180)是绕着(0, 0)坐标系进行旋转

为了能将图片显示,可将原点平移一下

painter.rotate(180);
//平移操作
painter.translate(-800, -600);
painter.drawPixmap(100, 100, 400, 400, pixmap);

image-20241001222426024

除了QPixmap,还有处理图像的类

  • QPixmap在显示器显示图片
  • QImage处理IO,允许像素级编辑
  • QBitmap属于QPixmap的子类
  • QPicture记录操作信息

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

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

相关文章

面了智谱大模型算法岗,效率贼高!

最近这一两周不少互联网公司都已经开始秋招提前批面试了。 不同以往的是,当前职场环境已不再是那个双向奔赴时代了。求职者在变多,HC 在变少,岗位要求还更高了。 最近,我们又陆续整理了很多大厂的面试题,帮助一些球友…

使用容器启动的zk无法暴露3888问题解决

1. 问题描述 zk配置如下: 我通过容器启动了一个zk,通过-p 参数暴露了2181和3888端口,容器启动脚本如下: #!/bin/shdocker rm -f myzookeeper1docker run -p 12181:2181 -p 13888:3888 --name myzookeeper1 --restart always …

C# 字符串(String)的应用说明一

一.字符串(String)的应用说明: 在 C# 中,更常见的做法是使用 string 关键字来声明一个字符串变量,也可以使用字符数组来表示字符串。string 关键字是 System.String 类的别名。 二.创建 String 对象的方法说明&#x…

c++ 使用 Graham 扫描的凸包(Convex Hull using Graham Scan)

先决条件: 如何检查两个给定的线段是否相交? c https://blog.csdn.net/hefeng_aspnet/article/details/141713655 java https://blog.csdn.net/hefeng_aspnet/article/details/141713762 python https://blog.csdn.net/hefeng_aspnet/article/details/…

Australis 相機率定軟體說明

概要 課堂中使用Australis這套軟體,順帶記錄操作過程 內容以老師口述及我測試的經過 照片為老師課堂提供之 說明 執行 Step1. 匯入照片 注意!!如果是Mac的作業系統,將資料夾移到Windows上的時候,建議創一個新的資料…

mysql---索引类型及索引方法使用

mysql索引类型 Normal、Full Text、Unique 在 MySQL 中,索引的类型主要有以下几种: Normal Index(普通索引): 这是最基本的索引类型,没有唯一性要求。允许重复值,可以加速查询性能。用法&#…

产品经理的学习

初学 接需求 画原型 写文档 日常产出 流程图 举例购物的流程 结构图 一个应用的全部功能,用思维导图的方式去罗列出来 竞品分析文档 竞品分类 竞品选择 竞品采集 竞品文档书写 也可以做一个产品的产品结构图 需求文档 干系人 需求方 记录人 产品经理 其他项目干系人…

搭建企业级私有仓库harbor

华子目录 harbor简介实验环境准备下载软件包安装docker-cehosts解析 实验步骤配置https加密传输解压进入解压目录,修改文件配置启动harbor 测试客户端配置harbor本地加速器注意 通过docker compose管理harbor harbor简介 harbor是由wmware公司开源的企业级docker r…

LLM基础概念:Token

什么是token?为什么要限制token的输入?平时说的消耗token数指的是什么? token是用于自然语言处理的词的片段。 在自然语言处理模型中,限制token数量主要是出于计算效率和资源限制的考虑。每一个token都对应一个向量,…

Linux gadget 模拟触控屏 支持多点触控

通过gadget命令行生成hid设备 下面xxx自己根据需要修改,例如VID,PID,产品名称 const char *INSTALL_GADGET_CMDS[] {"modprobe libcomposite","mkdir /sys/kernel/config/usb_gadget/g1","echo xxx > /sys/kernel/config/…

github项目--crawl4ai

github项目--crawl4ai 输出html输出markdown格式输出结构化数据与BeautifulSoup的对比 crawl4ai github上这个项目,没记错的话,昨天涨了3000多的star,今天又新增2000star。一款抓取和解析工具,简单写个demo感受下 这里我们使用cra…

衡水中学资料大全-重构版(状元、学霸笔记)

文章目录 一、衡水中学:教育界的璀璨明珠二、状元笔记:学霸的智慧传承三、学霸笔记:高效学习的秘籍四、全面复习资料:覆盖所有考点五、思维导图:构建知识框架六、获取方式 一、衡水中学:教育界的璀璨明珠 …

【React】入门Day01 —— 从基础概念到实战应用

目录 一、React 概述 二、开发环境创建 三、JSX 基础 四、React 的事件绑定 五、React 组件基础使用 六、组件状态管理 - useState 七、组件的基础样式处理 快速入门 – React 中文文档 一、React 概述 React 是什么 由 Meta 公司开发,是用于构建 Web 和原生…

语音转文字免费利器:助力高效办公与学习

语音转文字免费的软件如同一股清流,让我们能够更轻松地将语音信息转化为可编辑的文字内容。今天我们一起来分析它们的功能、特点以及如何为我们的生活和工作带来便利。 1.365在线转文字 链接直达:https://www.pdf365.cn/ 这是一个功能强大的在线工具…

网站集群批量管理-密钥认证与Ansible模块

一、集群批量管理-密钥认证 1、概述 管理更加轻松:两个节点,通过密钥形式进行访问,不需要输入密码,仅支持单向. 服务要求(应用场景): 一些服务在使用前要求我们做秘钥认证.手动写批量管理脚本. 名字: 密钥认证,免密码登录,双机互信. 2、原理 税钥对…

MySQL 的复制延迟:理解与解决方案

一、什么是 MySQL 的复制延迟? 在 MySQL 数据库中,复制是一种将数据从一个数据库服务器(主服务器)复制到一个或多个数据库服务器(从服务器)的机制。复制延迟指的是主服务器上的数据更改与这些更改在从服务…

DBeaver显示PostgreSQL数据库的信息模式

DBeaver连接PostgreSQL数据库后,默认情况下是不加载信息模式的,如果有需要,我们可以通过设置显示信息模式。 具体步骤:点击数据库连接–>右键打开设置–>连接设置–>常规–>导航视图–>自定义–>勾选显示系统对…

Python 基于 flask 的前程无忧招聘可视化系统,Python大数据招聘爬虫可视化分析

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

springboot的调度服务与异步服务实操

1.调度服务 1.1.JDK之ScheduledExecutorService 讲到调度任务,我们脑海里马上会想到ScheduledExecutorService。 ScheduledExecutorService是 Java java.util.concurrent 包中的一个接口,它继承自 ExecutorService 接口。它主要用于在给定的延迟后运行…

计算机毕业设计Python+Spark知识图谱微博舆情预测 微博推荐系统 微博可视化 微博数据分析 微博大数据 微博爬虫 Hadoop 大数据毕业设计

《PythonSpark知识图谱微博舆情预测》开题报告 一、课题背景与意义 随着互联网技术的飞速发展,社交媒体平台如微博已成为人们表达观点、交流信息的重要渠道。微博每天产生海量的数据,这些数据中蕴含着丰富的社会情绪、事件动态等信息,对于政…