【Qt】探索Qt绘图世界:自定义控件与视觉效果的全面指南

2024-06-02 20:04

本文主要是介绍【Qt】探索Qt绘图世界:自定义控件与视觉效果的全面指南,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言:
  • 1. 绘图基本概念
  • 2. 绘制各种形状
  • 3. 绘制文字(显示文字)、设置画笔
  • 4. 画刷
  • 5. 绘制图片
  • 6. 特殊的绘图设备
  • 总结:

前言:

在软件开发中,图形用户界面(GUI)的设计是至关重要的。Qt,作为一个跨平台的应用程序框架,提供了一套强大的工具和控件来帮助开发者创建美观且功能丰富的用户界面。然而,当现有的控件无法满足特定需求时,开发者就需要利用Qt提供的绘图API来自定义控件和效果。本文将详细介绍Qt中的绘图基本概念,包括绘制形状、文字、设置画笔和画刷、以及使用特殊的绘图设备等,旨在帮助开发者更好地理解和运用Qt的绘图功能。

1. 绘图基本概念

绘图:画画
前面学习 Qt 主要是学习 Qt 的各种控件 -> 本质上都是画出来的
Qt 的各种控件:都是一些常用的的东西,Qt 已经提前画好了,拿过来拿过来就能使用。
实际开发中,很有可能现有的控件无法满足需求,就需要自己 DIY 一些控件/效果。
Qt 提供的 绘图API就是为了解决上述问题的。
实际开发中大部分情况不需要使用绘图API

QPainter: 提供一系列的绘图方法,实现绘图的动作。
QPaintDevice: “画板”,你要画的内容是往啥东西上画,QWidger 就是 QPaintDevice 的子类。
QPen: “画笔” ,描述了 QPainter 画处来的线是什么样的。
QBrush: “画刷” 描述了 QPainter 填充一个区域是什么样的。

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

painEvent: 和它对应的,会有一个 QPaintEvent 事件

  1. 控件首次创建的时候;比如往 QWidget 上画画,QWidget 创建之前,画的东西当然不生效。首次创建 QWidget 就能显示出画的东西来。
  2. 控件被遮挡,再解除遮挡;这个时机进行绘制也是很重要的,否则绘制的内容就会在被遮挡之后就没了。
  3. 窗口最小化,再还原、
  4. 控件大小发生改变的时候
  5. 主动在代码中调用 repaint 或者 update 触发事件。(都是 QWidget提供的成员函数)

2. 绘制各种形状

QPainter painter(this);

这是定义在栈上的变量,不需要考虑释放的问题,此处指定的 this,不是父对象,而是指定绘制的设备(往啥东西上画)

void paintEvent(QPaintEvent *event); // 重写 paintEvent函数
void Widget::paintEvent(QPaintEvent *event)
{(void) event;// 绘图工作就会放到这里来执行QPainter painter(this);// 画一个线段painter.drawLine(20, 20, 200, 20);painter.drawLine(QPoint(20, 100), QPoint(200, 100));// 画一个矩形painter.drawRect(100, 100, 300, 200);// 画一个圆形painter.drawEllipse(200, 200, 100, 100); // 100,100 为外界矩形的宽度和高度
}

在这里插入图片描述

3. 绘制文字(显示文字)、设置画笔

painter.drawText(0, 100, "hello");

注意理解这里的坐标位置
此处的 0 横坐标,表示的是文字最左侧的位置。 此处的 100 纵坐标,表示的是文字的
“基线位置(baseline)”(四线格第三根线)

通过 Qpen 设置绘制的形状的颜色、粗细、样式
在这里插入图片描述

void Widget::paintEvent(QPaintEvent *event)
{(void) event;// 绘图工作就会放到这里来执行QPainter painter(this);QFont font("微软雅黑", 24);painter.setFont(font);QPen pen;// 设置为成红色的pen.setColor(QColor(255, 0, 0));// 设置线条的粗细pen.setWidth(5);// 设置线条的风格pen.setStyle(Qt::DashLine);// 让 painter 对象应用 pen 对象painter.setPen(pen);//    // 画一个线段
//    painter.drawLine(20, 20, 200, 20);
//    painter.drawLine(QPoint(20, 100), QPoint(200, 100));//    // 画一个矩形
//    painter.drawRect(100, 100, 300, 200);// 画一个圆形painter.drawEllipse(200, 200, 100, 100); // 100,100 为外界矩形的宽度和高度// 绘制文本painter.drawText(0, 100, "hello");
}

在这里插入图片描述

4. 画刷

QBrush 画刷:内部填充的:颜色、风格
在这里插入图片描述

QBrush brush;
brush.setColor(QColor(0, 255, 0));
painter.setBrush(brush);
// brush.setStyle(Qt::SolidPattern); // 实心填充
brush.setStyle(Qt::CrossPattern);
painter.setBrush(brush);

在这里插入图片描述

5. 绘制图片

Qt 提供了四个类来处理图像数据:QImageQPixmapQBitmapQPicture,它们都是常用的绘图设备。其中QImage主要用来进行 I/O 处理,它对 I/O 处理操作进行了优化,而且可以用来直接访问和操作像素;QPixmap 主要用来在屏幕上显示图像,它对在屏幕上显示图像进行了优化;QBitmapQPixmap 的子类,用来处理颜色深度为1的图像,即只能显示黑白两种颜色;QPicture 用来记录并重演 QPainter 命令。
QPixmap

void Widget::paintEvent(QPaintEvent *event)
{(void)event;QPainter painter(this);QPixmap pixmap(":/picture.jpg");//    // 基础绘制
//    painter.drawPixmap(50, 50, pixmap);// 图片缩放painter.drawPixmap(100, 100, 400, 300, pixmap);
}

在这里插入图片描述
旋转:

painter.rotate(180); // 绕着(0, 0) 坐标写原点进行旋转

为了能够让图片显示出来,可以把坐标系原点(Painter 的起点)平移一下,比如可以平移到窗口右下角。

旋转图片后 ,坐标就反过来了,此时往右移动,就是 x 要减小,往下移动,y 就要变大。

// 图片旋转,本质上是把 QPainter 对象进行了旋转,绘制的内容也就产生了旋转
painter.rotate(180); // 绕着(0, 0) 坐标写原点进行旋转
painter.translate(-800, -600); // 平移 
painter.drawPixmap(100, 100, 400, 300, pixmap);

在这里插入图片描述

6. 特殊的绘图设备

QPixmap:
在这里插入图片描述
QImage: 还允许对图片进行像素级编辑
QPixmap: 用于显示器上显示
QBitmap:特殊的Pixmap
QPicture: 对QPainter 的一系列操作步骤给记录下来

总结:

本文从Qt的绘图基本概念出发,逐步深入到形状的绘制、文字的显示、画笔和画刷的设置,以及图片的绘制等多个方面。我们了解到,虽然Qt提供了丰富的控件库,但在某些情况下,我们仍需通过自定义绘图来实现特定的视觉效果。通过使用QPainterQPaintDeviceQPenQBrush等类,我们可以在QWidget等画板上实现各种复杂的绘图操作。此外,文章还介绍了如何使用QImageQPixmapQBitmapQPicture等类来处理图像数据,以及如何通过旋转和缩放等变换来增强图像的显示效果。通过本文的学习,开发者应该能够更加自如地运用Qt的绘图API,创造出更加个性化和专业的用户界面。

这篇关于【Qt】探索Qt绘图世界:自定义控件与视觉效果的全面指南的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

OpenCV在Java中的完整集成指南分享

《OpenCV在Java中的完整集成指南分享》本文详解了在Java中集成OpenCV的方法,涵盖jar包导入、dll配置、JNI路径设置及跨平台兼容性处理,提供了图像处理、特征检测、实时视频分析等应用... 目录1. OpenCV简介与应用领域1.1 OpenCV的诞生与发展1.2 OpenCV的应用领域2

MyBatis-Plus 自动赋值实体字段最佳实践指南

《MyBatis-Plus自动赋值实体字段最佳实践指南》MyBatis-Plus通过@TableField注解与填充策略,实现时间戳、用户信息、逻辑删除等字段的自动填充,减少手动赋值,提升开发效率与... 目录1. MyBATis-Plus 自动赋值概述1.1 适用场景1.2 自动填充的原理1.3 填充策略

Python实现PDF按页分割的技术指南

《Python实现PDF按页分割的技术指南》PDF文件处理是日常工作中的常见需求,特别是当我们需要将大型PDF文档拆分为多个部分时,下面我们就来看看如何使用Python创建一个灵活的PDF分割工具吧... 目录需求分析技术方案工具选择安装依赖完整代码实现使用说明基本用法示例命令输出示例技术亮点实际应用场景扩

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

小白也能轻松上手! 路由器设置优化指南

《小白也能轻松上手!路由器设置优化指南》在日常生活中,我们常常会遇到WiFi网速慢的问题,这主要受到三个方面的影响,首要原因是WiFi产品的配置优化不合理,其次是硬件性能的不足,以及宽带线路本身的质... 在数字化时代,网络已成为生活必需品,追剧、游戏、办公、学习都离不开稳定高速的网络。但很多人面对新路由器

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

Spring Boot3.0新特性全面解析与应用实战

《SpringBoot3.0新特性全面解析与应用实战》SpringBoot3.0作为Spring生态系统的一个重要里程碑,带来了众多令人兴奋的新特性和改进,本文将深入解析SpringBoot3.0的... 目录核心变化概览Java版本要求提升迁移至Jakarta EE重要新特性详解1. Native Ima

SpringBoot集成MyBatis实现SQL拦截器的实战指南

《SpringBoot集成MyBatis实现SQL拦截器的实战指南》这篇文章主要为大家详细介绍了SpringBoot集成MyBatis实现SQL拦截器的相关知识,文中的示例代码讲解详细,有需要的小伙伴... 目录一、为什么需要SQL拦截器?二、MyBATis拦截器基础2.1 核心接口:Interceptor

从入门到进阶讲解Python自动化Playwright实战指南

《从入门到进阶讲解Python自动化Playwright实战指南》Playwright是针对Python语言的纯自动化工具,它可以通过单个API自动执行Chromium,Firefox和WebKit... 目录Playwright 简介核心优势安装步骤观点与案例结合Playwright 核心功能从零开始学习

Java堆转储文件之1.6G大文件处理完整指南

《Java堆转储文件之1.6G大文件处理完整指南》堆转储文件是优化、分析内存消耗的重要工具,:本文主要介绍Java堆转储文件之1.6G大文件处理的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言文件为什么这么大?如何处理这个文件?分析文件内容(推荐)删除文件(如果不需要)查看错误来源如何避