当前位置: 首页 > news >正文

Qt界面优化——绘图API

文章目录

    • 绘图核心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记录操作信息

相关文章:

  • 知识图谱入门——1:基本概念、为什么要用?核心步骤、常用工具与技术、应用场景
  • Spring 概述与环境搭建
  • 【AI知识点】度量学习(Metric Learning)
  • CommandLineRunner 和 ApplicationRunner
  • OceanBase技术解析: 执行器中的自适应技术
  • 您的计算机已被Lockbit3.0勒索病毒感染?恢复您的数据的方法在这里!
  • Android常用C++特性之std::abs
  • STM32 map 文件浅析
  • 互联网前后端分离的开发场景,一般会员和数据权限的判断是放在前端还是后端?
  • 二叉树进阶oj题【二叉树相关10道oj题的解析和c++代码实现】
  • 2024.09.19 校招 实习 内推 面经
  • 简单vue指令实现 el-table 可拖拽表格功能
  • Java 图片合成
  • Unity3D 客户端多开
  • 5个python多线程简单示例
  • [译] 理解数组在 PHP 内部的实现(给PHP开发者的PHP源码-第四部分)
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 2017 前端面试准备 - 收藏集 - 掘金
  • C# 免费离线人脸识别 2.0 Demo
  • FastReport在线报表设计器工作原理
  • JavaScript创建对象的四种方式
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • 闭包,sync使用细节
  • 基于组件的设计工作流与界面抽象
  • 学习Vue.js的五个小例子
  • 译有关态射的一切
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 再次简单明了总结flex布局,一看就懂...
  • 最近的计划
  • ​520就是要宠粉,你的心头书我买单
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • #APPINVENTOR学习记录
  • #git 撤消对文件的更改
  • (~_~)
  • (¥1011)-(一千零一拾一元整)输出
  • (C语言)fread与fwrite详解
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (附源码)计算机毕业设计大学生兼职系统
  • (转)如何上传第三方jar包至Maven私服让maven项目可以使用第三方jar包
  • .NET Core 版本不支持的问题
  • .NET Micro Framework初体验
  • .NET编程C#线程之旅:十种开启线程的方式以及各自使用场景和优缺点
  • .NET轻量级ORM组件Dapper葵花宝典
  • .net中的Queue和Stack
  • .sys文件乱码_python vscode输出乱码
  • .w文件怎么转成html文件,使用pandoc进行Word与Markdown文件转化
  • [ 数据结构 - C++]红黑树RBTree
  • [ 云计算 | AWS ] AI 编程助手新势力 Amazon CodeWhisperer:优势功能及实用技巧
  • [14]内置对象
  • [BZOJ 3531][Sdoi2014]旅行(树链剖分+线段树)
  • [C#] 基于 Token 的鉴权与签名机制详解 接口对接鉴权 token、sign(a=1b=2c=3d=4)、Base64、参数加密、MD5
  • [C#] 我的log4net使用手册