Windows图形界面(GUI)-QT-C/C++ - Qt图形绘制详解

  • 公开视频 -> 链接点击跳转公开课程
  • 博客首页 -> ​​​链接点击跳转博客主页

目录

Qt绘图基础

QPainter概述

基本工作流程

绘图事件系统

paintEvent事件

重绘机制

文字绘制技术

基本文字绘制

​编辑

高级文字效果

基本图形绘制

线条绘制

​编辑

形状绘制

​编辑

图片处理

基本图片绘制

高级图片效果

​编辑

特效与动画

渐变效果

​编辑

时钟绘制


Qt绘图基础

QPainter概述

QPainter是Qt中的核心绘图类,提供了高度抽象的2D绘图功能。它允许我们在各种设备上进行绘制,包括:

  • 窗口部件(QWidget)
  • 像素图(QPixmap)
  • 图像(QImage)

基本工作流程

void Widget::paintEvent(QPaintEvent* event)
{QPainter painter(this);  // 设置绘图属性painter.setRenderHint(QPainter::Antialiasing); // 进行绘制操作painter.drawLine(0, 0, 100, 100);
}

 

绘图事件系统

paintEvent事件

paintEvent是Qt中处理绘制的核心事件,在以下情况会被触发:

  • 窗口首次显示
  • 窗口从最小化恢复
  • 窗口被其他窗口遮挡后重新显示
  • 调用update()或repaint()函数

重绘机制

class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void paintEvent(QPaintEvent* event) override{QPainter painter(this);// 绘制代码}void updateContent(){update();  // 请求重绘,异步// repaint();  // 立即重绘,同步}private:Ui::Widget *ui;
};

文字绘制技术

基本文字绘制

class Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void paintEvent(QPaintEvent*) override{QPainter painter(this);// 设置字体QFont font("Arial", 20);font.setBold(true);painter.setFont(font);// 设置颜色painter.setPen(QColor(255, 0, 0));// 绘制文本painter.drawText(rect(), Qt::AlignCenter, "Hello Qt!");}private:Ui::Widget *ui;
};

高级文字效果

    void paintEvent(QPaintEvent*) override{QPainter painter(this);// 文字阴影效果QFont font("Times", 40);painter.setFont(font);// 绘制阴影painter.setPen(QColor(0, 0, 0, 127));painter.drawText(rect().adjusted(2, 2, 2, 2),Qt::AlignCenter, "Shadow Text");// 绘制主文本painter.setPen(Qt::white);painter.drawText(rect(), Qt::AlignCenter, "Shadow Text");}

基本图形绘制

线条绘制

void paintEvent(QPaintEvent*) override  
{  QPainter painter(this);  // 设置画笔  QPen pen(Qt::red, 2, Qt::SolidLine, Qt::RoundCap, Qt::RoundJoin);  painter.setPen(pen);  // 绘制各种线条  painter.drawLine(10, 10, 100, 100);  // 直线  painter.drawArc(10, 120, 80, 80, 0, 180 * 16);  // 圆弧  
}

形状绘制

   void paintEvent(QPaintEvent*) override  {  QPainter painter(this);  // 矩形  painter.fillRect(10, 10, 90, 60, Qt::blue);  // 圆形  painter.drawEllipse(120, 10, 90, 90);  // 多边形  QPolygon polygon;  polygon << QPoint(10,100) << QPoint(110,100)   << QPoint(60,180);  painter.drawPolygon(polygon);  }

图片处理

基本图片绘制

void paintEvent(QPaintEvent*) override  
{  QPainter painter(this);  QPixmap pixmap(":/images/example.png");  painter.drawPixmap(10, 10, pixmap);  
}

高级图片效果

    void paintEvent(QPaintEvent*) override{QPainter painter(this);QPixmap pixmap("C:\\Users\\Administrator\\Desktop\\图形界面-QT.png");// 图片缩放QPixmap scaled = pixmap.scaled(200, 200,Qt::KeepAspectRatio,Qt::SmoothTransformation);// 添加圆形裁剪QPainterPath path;path.addEllipse(10, 10, 200, 200);painter.setClipPath(path);painter.drawPixmap(10, 10, scaled);}

特效与动画

渐变效果

void paintEvent(QPaintEvent*) override  
{  QPainter painter(this);  // 线性渐变  QLinearGradient gradient(0, 0, width(), height());  gradient.setColorAt(0, Qt::red);  gradient.setColorAt(1, Qt::blue);  painter.fillRect(rect(), gradient);  
}

时钟绘制

class ClockWidget : public QWidget
{Q_OBJECTpublic:explicit ClockWidget(QWidget *parent = nullptr) : QWidget(parent){setFixedSize(400, 400);QTimer *timer = new QTimer(this);connect(timer, &QTimer::timeout, this, QOverload<>::of(&ClockWidget::update));timer->start(1000);}protected:void paintEvent(QPaintEvent *event) override{Q_UNUSED(event);QPainter painter(this);painter.setRenderHint(QPainter::Antialiasing);painter.translate(width() / 2, height() / 2);QTime currentTime = QTime::currentTime();drawClockPlate(&painter);drawHourHand(&painter, currentTime);drawMinuteHand(&painter, currentTime);drawSecondHand(&painter, currentTime);drawCenterPoint(&painter);}private:void drawClockPlate(QPainter *painter){QPen pen(Qt::black);pen.setWidth(2);painter->setPen(pen);painter->setBrush(Qt::white);painter->drawEllipse(-180, -180, 360, 360);for (int i = 0; i < 60; ++i) {painter->save();painter->rotate(6.0 * i);if (i % 5 == 0) {pen.setWidth(3);painter->setPen(pen);painter->drawLine(0, -160, 0, -145);painter->save();painter->rotate(-6.0 * i);QFont font("Arial", 15, QFont::Bold);painter->setFont(font);int num = (i / 5 == 0) ? 12 : i / 5;QRect textRect(-20, -190, 40, 40);painter->drawText(textRect, Qt::AlignCenter, QString::number(num));painter->restore();} else {pen.setWidth(1);painter->setPen(pen);painter->drawLine(0, -160, 0, -150);}painter->restore();}}void drawHourHand(QPainter *painter, const QTime &time){painter->save();double angle = 30.0 * (time.hour() % 12) + 0.5 * time.minute();painter->rotate(angle);QPen pen(Qt::black, 4);painter->setPen(pen);painter->drawLine(0, 0, 0, -80);painter->restore();}void drawMinuteHand(QPainter *painter, const QTime &time){painter->save();double angle = 6.0 * time.minute() + 0.1 * time.second();painter->rotate(angle);QPen pen(Qt::blue, 3);painter->setPen(pen);painter->drawLine(0, 0, 0, -120);painter->restore();}void drawSecondHand(QPainter *painter, const QTime &time){painter->save();double angle = 6.0 * time.second();painter->rotate(angle);QPen pen(Qt::red, 2);painter->setPen(pen);painter->drawLine(0, 20, 0, -140);painter->restore();}void drawCenterPoint(QPainter *painter){painter->setPen(Qt::NoPen);painter->setBrush(Qt::red);painter->drawEllipse(-8, -8, 16, 16);painter->setBrush(Qt::black);painter->drawEllipse(-4, -4, 8, 8);}
};

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

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

相关文章

《计算机网络》课后探研题书面报告_网际校验和算法

网际校验和算法 摘 要 本文旨在研究和实现网际校验和&#xff08;Internet Checksum&#xff09;算法。通过阅读《RFC 1071》文档理解该算法的工作原理&#xff0c;并使用编程语言实现网际校验和的计算过程。本项目将对不同类型的网络报文&#xff08;包括ICMP、TCP、UDP等&a…

浅谈计算机网络02 | SDN控制平面

计算机网络控制平面 一、现代计算机网络控制平面概述1.1 与数据平面、管理平面的关系1.2 控制平面的发展历程 二、控制平面的关键技术剖析2.1 网络层协议2.1.1 OSPF协议2.1.2 BGP协议 2.2 SDN控制平面技术2.2.1 SDN架构与原理2.2.2 OpenFlow协议2.2.3 SDN控制器 一、现代计算机…

网络层协议-----IP协议

目录 1.认识IP地址 2.IP地址的分类 3.子网划分 4.公网IP和私网IP 5.IP协议 6.如何解决IP地址不够用 1.认识IP地址 IP 地址&#xff08;Internet Protocol Address&#xff09;是指互联网协议地址。 它是分配给连接到互联网的设备&#xff08;如计算机、服务器、智能手机…

我国无人机新增实名登记110.3 万架,累计完成飞行2666万小时

据央视新闻从中国民航局了解到&#xff0c;2024 年我国全年新增通航企业 145 家、通用机场 26 个&#xff0c;颁发无人驾驶航空器型号合格证 6 个、新增实名登记无人机 110.3 万架&#xff0c;无人机运营单位总数超过 2 万家&#xff0c;累计完成无人机飞行 2666 万小时&#x…

【Linux】正则表达式

正则表达式是一种可供Linux工具过滤文本的自定义模板&#xff0c;Linux工具&#xff08;如sed、gawk&#xff09;会在读取数据时使用正则表达式对数据进行模式匹配。 正则表达式使用元字符来描述数据流中的一个或多个字符。它是由正则表达式引擎实现的。正则表达式引擎是一种底…

数据平台浅理解

定义 数据平台架构是指用于收集、存储、处理和分析数据的一系列组件、技术和流程的整体架构设计。它就像是一个复杂的数据生态系统的蓝图&#xff0c;旨在高效地管理数据从产生源头到产生价值的整个生命周期。 主要层次 数据源层 这是数据的起点&#xff0c;包含各种类型的数据…

Python入门10:高阶函数

一、什么是高阶函数 1.1、高阶函数的概念和作用&#xff1a; 高阶函数是指 接受函数作为参数 或者 返回函数 作为结果的函数。它在函数式编程中是一个重要概念&#xff08;函数式编程&#xff08;Functional Programming &#xff0c; FP &#xff09;是一 种编程范式&#xf…

浅谈云计算12 | KVM虚拟化技术

KVM虚拟化技术 一、KVM虚拟化技术基础1.1 KVM虚拟化技术简介1.2 KVM虚拟化技术架构1.2.1 KVM内核模块1.2.2 用户空间工具&#xff08;QEMU、Libvirt等&#xff09; 二、KVM虚拟化技术原理2.1 硬件辅助虚拟化2.2 VMCS结构与工作机制 三、KVM虚拟化技术面临的挑战与应对策略3.1 性…

GO:GO程序如何处理缓存加载和大数据缓存

如果我们会在程序启动时&#xff0c;需要加载所有数据&#xff0c;最简单的方式就是程序启动&#xff0c;通过轮训从数据库拉取所有数据&#xff0c;并写入到本地缓存中。 问题&#xff1a;数据量较大的时候&#xff0c;程序加载慢&#xff0c;启动时间长&#xff0c;遇到问题不…

【优选算法篇】:分而治之--揭秘分治算法的魅力与实战应用

✨感谢您阅读本篇文章&#xff0c;文章内容是个人学习笔记的整理&#xff0c;如果哪里有误的话还请您指正噢✨ ✨ 个人主页&#xff1a;余辉zmh–CSDN博客 ✨ 文章所属专栏&#xff1a;优选算法篇–CSDN博客 文章目录 一.什么是分治算法1.分治算法的基本概念2.分治算法的三个步…

OpenAI Whisper:语音识别技术的革新者—深入架构与参数

当下语音识别技术正以前所未有的速度发展&#xff0c;极大地推动了人机交互的便利性和效率。OpenAI的Whisper系统无疑是这一领域的佼佼者&#xff0c;它凭借其卓越的性能、广泛的适用性和创新的技术架构&#xff0c;正在重新定义语音转文本技术的规则。今天我们一起了解一下Whi…

python+playwright自动化测试(一):安装及简单使用,截图录屏

目录 基本使用 浏览器调用 启用浏览器 创建窗口对象 访问URL 页面的刷新、返回、前进 关闭 截图、录屏、保存pdf 截图 录屏 保存为pdf 设置窗口大小 调试模式 手机模式及new_context的更多参数 手机模式 new_context的其他参数 设置语言和时区 设置和修改位置…

初识C++(二)

六、引用 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间。 通俗地讲&#xff0c;可以理解为一个人能够拥有多个称呼&#xff0c;这些所有的称呼都是表示这一…

【RedisStack】Linux安装指南

【RedisStack】Linux安装指南.md 前言下载解压创建启动文件设置密码把密码设置到环境变量启动/停止相关命令测试&验证官网资料参考资料 前言 Redis Stack是使用Redis的最佳起点。我们将我们必须提供的最好的技术捆绑在一起&#xff0c;形成一个易于使用的软件包。Redis St…

达梦8-DMSQL程序设计学习笔记1-DMSQL程序简介

1、DMSQL程序简介 DMSQL程序是达梦数据库对标准SQL语言的扩展&#xff0c;是一种过程化SQL语言。在DMSQL程序中&#xff0c;包括一整套数据类型、条件结构、循环结构和异常处理结构等&#xff0c;DMSQL程序中可以执行SQL语句&#xff0c;SQL语句中也可以使用DMSQL函数。 DMSQ…

STM32 FreeRTOS 基础知识

多任务处理 内核是操作系统的核心组件。诸如 Linux 这样的操作系统采用的内核&#xff0c; 看似允许用户同时访问计算机。很明显&#xff0c;多个用户可以同时执行多个程序。 每个执行程序都是受操作系统控制的任务&#xff08;或线程&#xff09;。如果一个操作系统能够以这…

T-SQL编程

目录 1、T-SQL的元素 1.1 标识符 1. 常规标识符 2. 分隔标识符 1.2 变量 1. 全局变量 2. 局部变量 1.3 运算符 1. 算数运算符 2. 赋值运算符 3. 位运算符 4. 比较运算符 5. 逻辑运算符 6. 字符串连接运算符 7. 一元运算符 8. 运算符的优先级和结合性 1.4 批处…

js中的Object.defineProperty()详解

文章目录 一、Object.defineProperty()二、descriptor属性描述符2.1、数据描述符2.2、访问器描述符2.3、descriptor属性2.3.1、value2.3.2、writable2.3.3、enumerable &#xff08;可遍历性&#xff09;2.3.4、configurable &#xff08;可配置性&#xff09; 三、注意事项 一…

【搭建JavaEE】(2)Tomcat安装配置和第一个JavaEE程序

Tomcat–容器(Container) 下载 Apache Tomcat - Welcome! 下载完成 请求/响应 结构 测试 查看Jdk版本 改端口号localhost8080–>8099 学学人家以后牛逼了可以用自己名字当文件夹名 配置端口8099 找到server文件 用记事本打开 再打开另一个logging文件 ”乱码解决“步骤&…

centos7.6 安装nginx 1.21.3与配置ssl

1 安装依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel2 下载Nginx wget http://nginx.org/download/nginx-1.21.3.tar.gz3 安装目录 mkdir -p /data/apps/nginx4 安装 4.1 创建用户 创建用户nginx使用的nginx用户。 #添加www组 # groupa…