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

【QT】基本的绘图操作和高级绘图

基本绘图

新建项目

重新绘图事件

画基本图形

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}// 重写绘图事件
void Widget::paintEvent(QPaintEvent *event)
{// 创建画家// this表示绘图设备,往当前窗口画画QPainter painter(this);painter.drawLine(QPoint(0, 0), QPoint(100, 100));                 // 画线painter.drawEllipse(QPoint(100, 100), 50, 50);                    // 画圆(椭圆)painter.drawRect(QRect(20, 20, 50, 50));                          // 画矩形
}

效果

写字

    // 写字painter.setFont(QFont("华文彩云", 20));         // 设置字体字号painter.drawText(QRect(0, 200, 200, 150), "好好学习,天天向上");

效果

设置画笔颜色、宽度、风格

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}// 重写绘图事件
void Widget::paintEvent(QPaintEvent *event)
{// 创建画家// this表示绘图设备,往当前窗口画画QPainter painter(this);// 指定画笔QPen pen(QColor(255, 0, 0));// 设置画笔的宽度pen.setWidth(3);        // 默认是1// 设置画笔风格pen.setStyle(Qt::DotLine);// 画家使用画笔painter.setPen(pen);painter.drawLine(QPoint(0, 0), QPoint(100, 100));                 // 画线painter.drawEllipse(QPoint(100, 100), 50, 50);                    // 画圆(椭圆)painter.drawRect(QRect(20, 20, 50, 50));                          // 画矩形// 写字painter.setFont(QFont("华文彩云", 20));         // 设置字体字号painter.drawText(QRect(0, 200, 200, 150), "好好学习,天天向上");}

效果

画刷,可以填充封闭的图案
#include "widget.h"
#include "ui_widget.h"
#include <QPainter>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}// 重写绘图事件
void Widget::paintEvent(QPaintEvent *event)
{// 创建画家// this表示绘图设备,往当前窗口画画QPainter painter(this);// 指定画笔QPen pen(QColor(255, 0, 0));// 设置画笔的宽度pen.setWidth(3);        // 默认是1// 设置画笔风格pen.setStyle(Qt::DotLine);// 画家使用画笔painter.setPen(pen);// 画刷,可以填充封闭的图案QBrush brush(Qt::cyan);         // 青色// 设置画刷风格brush.setStyle(Qt::Dense5Pattern);// 画家使用画刷painter.setBrush(brush);painter.drawLine(QPoint(0, 0), QPoint(100, 100));                 // 画线painter.drawEllipse(QPoint(100, 100), 50, 50);                    // 画圆(椭圆)painter.drawRect(QRect(20, 20, 50, 50));                          // 画矩形// 写字painter.setFont(QFont("华文彩云", 20));         // 设置字体字号painter.drawText(QRect(0, 200, 200, 150), "好好学习,天天向上");}

效果

高级绘图

设置抗锯齿

    painter.drawEllipse(QPoint(100, 100), 50, 50);          // 画圆// 设置抗锯齿painter.setRenderHint(QPainter::Antialiasing);painter.drawEllipse(QPoint(250, 100), 50, 50);          // 画圆

效果

移动画家

    painter.drawRect(QRect(20, 20, 50, 50));// 移动画家painter.translate(100, 0);painter.save();                 // 保存painter.drawRect(QRect(20, 20, 50, 50));painter.translate(100, 0);painter.restore();              // 恢复到100处painter.drawRect(QRect(20, 20, 50, 50));

效果

画成品图,导入资源:【QT】资源文件导入_复制其他项目中的文件到qt项目中_StudyWinter的博客-CSDN博客

代码

    // 画成品的图案QPixmap pix;pix.load(":/Image/Luffy.png");painter.drawPixmap(0, 0, pix);

效果

在UI文件中加pushbutton,点击button,图片移动。

加入成员变量记录坐标信息

Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);posX = 0;// 点击移动按钮,图片移动connect(ui->pushButton, &QPushButton::clicked, this, [=]() {posX += 10;// 重新画图,手动调用update();       // 自动调用paintEvent});
}

效果

图片左边出去,可以从右边回来

    // 画成品的图案QPixmap pix;pix.load(":/Image/Luffy.png");// 窗口的宽度if (posX > this->width()) {// 重置posX = 0 - pix.width();}painter.drawPixmap(posX, 0, pix);

效果

图片自动移动,利用定时器

    // 图片自动移动QTimer* time = new QTimer(this);time->start(10);connect(time, &QTimer::timeout, this, [=]() {posX++;update();});

所有代码

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();// 重写绘图事件void paintEvent(QPaintEvent *event);// 记录坐标int posX;private:Ui::Widget *ui;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
#include <QPushButton>
#include <QTimer>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);posX = 0;// 点击移动按钮,图片移动connect(ui->pushButton, &QPushButton::clicked, this, [=]() {posX += 10;// 重新画图,手动调用update();       // 自动调用paintEvent});// 图片自动移动QTimer* time = new QTimer(this);time->start(10);connect(time, &QTimer::timeout, this, [=]() {posX++;update();});
}Widget::~Widget()
{delete ui;
}// 重写绘图事件
void Widget::paintEvent(QPaintEvent *event)
{// 创建画家// this表示绘图设备,往当前窗口画画QPainter painter(this);/***************************************基本绘图**************************************///    // 指定画笔
//    QPen pen(QColor(255, 0, 0));
//    // 设置画笔的宽度
//    pen.setWidth(3);        // 默认是1
//    // 设置画笔风格
//    pen.setStyle(Qt::DotLine);
//    // 画家使用画笔
//    painter.setPen(pen);//    // 画刷,可以填充封闭的图案
//    QBrush brush(Qt::cyan);         // 青色
//    // 设置画刷风格
//    brush.setStyle(Qt::Dense5Pattern);
//    // 画家使用画刷
//    painter.setBrush(brush);//    painter.drawLine(QPoint(0, 0), QPoint(100, 100));                 // 画线
//    painter.drawEllipse(QPoint(100, 100), 50, 50);                    // 画圆(椭圆)
//    painter.drawRect(QRect(20, 20, 50, 50));                          // 画矩形//    // 写字
//    painter.setFont(QFont("华文彩云", 20));         // 设置字体字号
//    painter.drawText(QRect(0, 200, 200, 150), "好好学习,天天向上");/*****************************************高级绘图****************************************/
//    painter.drawEllipse(QPoint(100, 100), 50, 50);          // 画圆//    // 设置抗锯齿
//    painter.setRenderHint(QPainter::Antialiasing);
//    painter.drawEllipse(QPoint(250, 100), 50, 50);          // 画圆//    painter.drawRect(QRect(20, 20, 50, 50));
//    // 移动画家
//    painter.translate(100, 0);
//    painter.save();                 // 保存
//    painter.drawRect(QRect(20, 20, 50, 50));
//    painter.translate(100, 0);
//    painter.restore();              // 恢复到100处
//    painter.drawRect(QRect(20, 20, 50, 50));// 画成品的图案QPixmap pix;pix.load(":/Image/Luffy.png");// 窗口的宽度if (posX > this->width()) {// 重置posX = 0 - pix.width();}painter.drawPixmap(posX, 0, pix);}

相关文章:

  • 算法:查找数组中第K大的元素
  • ONNX的结构与转换
  • 数仓建模—数仓建设概论
  • js替换字符串中的某个字符
  • TypeScript深度剖析:TypeScript 中枚举类型应用场景?
  • Maven Repository使用
  • 进程空间管理:用户态和内核态
  • 微信小程序——简易复制文本
  • SpringCloud(七) Feign远程调用
  • 项目实战:给首页上库存名称添加超链接然后带fid跳转到edit页面
  • K8S的pod创建过程
  • Star History 九月开源精选 |开源 GitHub Copilot 替代
  • 某数据库为提升搜索效率,对某一整型字段构建二叉搜索树(BST)
  • vue2+antd——实现动态菜单路由功能——基础积累
  • 基于CMFB余弦调制滤波器组的频谱响应matlab仿真
  • java取消线程实例
  • Laravel Mix运行时关于es2015报错解决方案
  • nodejs实现webservice问题总结
  • React as a UI Runtime(五、列表)
  • React系列之 Redux 架构模式
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 力扣(LeetCode)21
  • 码农张的Bug人生 - 初来乍到
  • 使用 @font-face
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 算法---两个栈实现一个队列
  • 用简单代码看卷积组块发展
  • #《AI中文版》V3 第 1 章 概述
  • #Linux(权限管理)
  • #数学建模# 线性规划问题的Matlab求解
  • $().each和$.each的区别
  • $GOPATH/go.mod exists but should not goland
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (二十四)Flask之flask-session组件
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (一) storm的集群安装与配置
  • (译) 函数式 JS #1:简介
  • **PHP二维数组遍历时同时赋值
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • . Flume面试题
  • .NET Core IdentityServer4实战-开篇介绍与规划
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .net 按比例显示图片的缩略图
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)
  • .考试倒计时43天!来提分啦!
  • /etc/skel 目录作用
  • [ web基础篇 ] Burp Suite 爆破 Basic 认证密码
  • [ 常用工具篇 ] AntSword 蚁剑安装及使用详解
  • [acm算法学习] 后缀数组SA