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控制器 一、现代计算机…

51_Lua面向对象编程

面向对象编程(Object Oriented Programming,OOP)是一种非常流行的计算机编程架构。像C++、Java、Objective-C、Smalltalk、C#、Ruby等编程语言都支持面向对象编程。 1.面向对象编程特性 面向对象编程是一种编程范式,它使用“对象”来设计软件。对象是数据和行为的封装单元…

《重生到现代之从零开始的C++生活》—— 入门基础语法

命名空间 创建 namespace name {int a;char b; }命名空间是干什么的呢? 已知我们读取变量都是先读取局部变量&#xff0c;再读取全局变量&#xff0c;但是如果碰到一些起名重合的时候会报错&#xff0c;我们只能换变量名 那么有没有方法能让其不报错&#xff0c;让他们合法…

SpringBoot整合Easy-es

一.什么是Easy-Es Easy-Es&#xff08;简称EE&#xff09;是一款基于ElasticSearch(简称Es)官方提供的RestHighLevelClient打造的ORM开发框架&#xff0c;在 RestHighLevelClient 的基础上,只做增强不做改变&#xff0c;为简化开发、提高效率而生,您如果有用过Mybatis-Plus(简称…

网络层协议-----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…

MySQL主从:如何处理“Got Fatal Error 1236”或 MY-013114 错误(percona译文)

错误的 GTID 如今&#xff0c;典型的复制设置使用 GTID 模式&#xff0c;完整的错误消息可能如下所示&#xff1a; mysql > show replica status\G *************************** 1. row ***************************Replica_IO_Running: NoReplica_SQL_Running: YesLast_I…

【Linux】正则表达式

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

数据平台浅理解

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

Python入门10:高阶函数

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

Android ScrollView嵌套X5WebView大片空白问题

scrollview嵌套后webview的高度不可控。留有大片空白。 注&#xff1a;官方不建议scrollview嵌套webview 最好让webview自身滚动 解决方案&#xff1a; act_news_detail_wv.setWebViewClient(new WebViewClient() {Overridepublic void onPageFinished(WebView webView, Str…

浅谈云计算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.分治算法的三个步…

【人工智能】从Keras到TensorFlow 2.0:深入掌握Python深度学习技术

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门&#xff01; 解锁Python编程的无限可能&#xff1a;《奇妙的Python》带你漫游代码世界 随着人工智能技术的迅猛发展&#xff0c;深度学习作为其核心分支&#xff0c;已在图像识别、自然语言处理、语音识别等…

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

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

MATLAB学习笔记-table

table 的每一列具有固定的数据类型。如果要让表的所有单元格都可以任意填充&#xff0c;就得让每一列都是 cell 类型&#xff0c;这样表中每个单元格都是“一个元胞”。创建时可以先构造一个 空 cell 数组&#xff08;大小为行数列数&#xff09;&#xff0c;再用 cell2table 转…

Spring Boot教程之五十六:用 Apache Kafka 消费 JSON 消息

Spring Boot | 如何使用 Apache Kafka 消费 JSON 消息 Apache Kafka 是一个流处理系统&#xff0c;可让您在进程、应用程序和服务器之间发送消息。在本文中&#xff0c;我们将了解如何使用 Apache Kafka 在 Spring Boot 应用程序的控制台上发布 JSON 消息。 为了了解如何创建 …

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

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