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

server/2025/1/16 9:05:34/
  • 公开视频 -> 链接点击跳转公开课程
  • 博客首页 -> ​​​链接点击跳转博客主页

目录

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.ppmy.cn/server/158784.html

相关文章

Flink (五) :DataStream API (二)

1. Transformations 用户通过算子能将一个或多个 DataStream 转换成新的 DataStream&#xff0c;在应用程序中可以将多个数据转换算子合并成一个复杂的数据流拓扑。 1.1 Map DataStream → DataStream: 输入一个元素同时输出一个元素。下面是将输入流中元素数值加倍的 map f…

lanqiaoOJ 3333:肖恩的排序 ← 双指针+排序(从大到小)

【题目来源】https://www.lanqiao.cn/problems/3333/learning/【题目描述】 肖恩提出了一种新的排序方法。 该排序方法需要一个标准数组 B 和一个待排序数组 A。在确保对于所有位置 i 都有 A[i]>B[i] 的前提下&#xff0c;肖恩可以自由选择 A 数组的排序结果。请计算按照这种…

1.3 k8s-上部署第一个应用程序

本节重点总结&#xff1a; 部署nginx Deploymentkubectl 基础命令 apply对资源进行配置get 查看资源describe 查看资源详细信息logs 查看pod中的日志exec 在pod中的容器环境内执行命令 Deployment 基本概念 Deployment 译名为 部署。在k8s中&#xff0c;通过发布 Deployment…

excel仅复制可见单元格,仅复制筛选后内容

背景 我们经常需要将内容分给不同的人&#xff0c;做完后需要合并 遇到情况如下 那是因为直接选择了整列&#xff0c;当然不可以了。 下面提供几种方法&#xff0c;应该都可以 直接选中要复制区域然后复制&#xff0c;不要选中最上面的列alt;选中可见单元格正常复制&#xff…

MATLAB学习笔记目录

MATLAB学习笔记-生成纯音并保存-CSDN博客 MATLAB学习笔记-各种格式之间的转换 - 知乎 MATLAB学习笔记-胞组&#xff08;cell array&#xff09;转换为矩阵&#xff0c;cell2mat_matlab如何把元胞数组改为矩阵-CSDN博客MATLAB学习笔记-判断数组、结构体、数值、字符串是否相同…

NLP自然语言处理分词模块PaddleNLP

自然语言处理(NLP)是人工智能的重要组成部分,主要用于处理和分析自然语言数据。在中文的自然语言处理中,分词是关键的一环。分词是指将一段连续的文字切分成一个个单独的词语或短语,以便于进一步的分析和处理。 PaddleNLP 是基于飞桨(PaddlePaddle)深度学习框架的自然语…

【React】脚手架进阶

目录 暴露webpack配置package.json的变化修改webpack.config.js配置less修改域名、端口号浏览器兼容处理处理跨域 暴露webpack配置 react-scripts对脚手架中的打包命令进行封装&#xff0c;如何暴露这些打包配置呢&#xff1f;上篇写到在package.json中的scripts配置项中有eje…

通过将模型权重的矩阵表示为低秩矩阵,可以减少需要调整的参数数量,通俗易懂的解释,不懂你爬网线打我

通过将模型权重矩阵表示为低秩矩阵&#xff0c;可以减少需要调整的参数数量&#xff0c;原因在于低秩矩阵的结构本身就比高秩矩阵更“紧凑”&#xff0c;即它们需要的独立参数更少。具体来说&#xff0c;低秩矩阵的结构可以通过减少模型的自由度&#xff08;独立参数的数量&…