Qt绘图(线条、椭圆、矩形、图片滚动)

news2025/1/16 5:40:38

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    //绘图事件
    void  paintEvent(QPaintEvent *);

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

一、基本绘制

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QPainter>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

void Widget::paintEvent(QPaintEvent *){
    //实例化画家对象 this指定的是绘图设备
    QPainter painter(this);
    //设置画笔
    QPen pen(QColor(255,0,0));
    //设置画笔宽度
    pen.setWidth(3);
    //设置画笔风格
    pen.setStyle(Qt::DotLine);

    //让画家 使用这个笔
    painter.setPen(pen);

    //设置画刷
    QBrush brush(Qt::cyan);
    //设置画刷风格
    brush.setStyle(Qt::Dense1Pattern);

    //让画家使用画刷
    painter.setBrush(brush);

    //画线
    painter.drawLine(QPoint(0,0),QPoint(100,100));

    //画椭圆
    painter.drawEllipse(QPoint(100,100),50,50);

    //画矩形
    QPen pen2(QColor(125,125,125));
    painter.setPen(pen2);
    painter.drawRect(QRect(50,50,50,50));

    //画文字
    painter.drawText(QRect(10,200,150,150),"Hello,world");
}
Widget::~Widget()
{
    delete ui;
}

二、高级设置(抗锯齿、移动原点)

#include "widget.h"
#include "ui_widget.h"
#include<QPainter>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

void Widget::paintEvent(QPaintEvent *){
    //    //实例化画家对象 this指定的是绘图设备
    //    QPainter painter(this);
    //    //设置画笔
    //    QPen pen(QColor(255,0,0));
    //    //设置画笔宽度
    //    pen.setWidth(3);
    //    //设置画笔风格
    //    pen.setStyle(Qt::DotLine);

    //    //让画家 使用这个笔
    //    painter.setPen(pen);

    //    //设置画刷
    //    QBrush brush(Qt::cyan);
    //    //设置画刷风格
    //    brush.setStyle(Qt::Dense1Pattern);

    //    //让画家使用画刷
    //    painter.setBrush(brush);

    //    //画线
    //    painter.drawLine(QPoint(0,0),QPoint(100,100));

    //    //画椭圆
    //    painter.drawEllipse(QPoint(100,100),50,50);

    //    //画矩形
    //    QPen pen2(QColor(125,125,125));
    //    painter.setPen(pen2);
    //    painter.drawRect(QRect(50,50,50,50));

    //    //画文字
    //    painter.drawText(QRect(10,200,150,150),"Hello,world");

    QPainter painter(this);
    painter.drawEllipse(QPoint(100,50),50,50);
    //设置 抗锯齿能力 效率低下
    painter.setRenderHint(QPainter::Antialiasing);
    painter.drawEllipse(QPoint(200,50),50,50);

    //画矩形
    painter.drawRect(20,120,50,50);

    //移动画家
    painter.translate(100,0);
    //保存画家状态
    painter.save();

    painter.drawRect(20,120,50,50);

    painter.translate(100,0);

    //还原画家保存状态
    painter.restore();

    painter.drawRect(20,120,50,50);
}
Widget::~Widget()
{
    delete ui;
}

 

三、绘制图片

#include "widget.h"
#include "ui_widget.h"
#include<QPainter>
#include<QTimer>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    QTimer * qtimer=new QTimer(this);
    qtimer->start(100);
    
    connect(qtimer,&QTimer::timeout,ui->pushButton,&QPushButton::click);
    //点击移动按钮,移动图片
    connect(ui->pushButton,&QPushButton::clicked,[=](){
        pox+=20;
        //如果要手动调用绘图时间 用update更新
        update();
    });
}

void Widget::paintEvent(QPaintEvent *){
    //    //实例化画家对象 this指定的是绘图设备
    //    QPainter painter(this);
    //    //设置画笔
    //    QPen pen(QColor(255,0,0));
    //    //设置画笔宽度
    //    pen.setWidth(3);
    //    //设置画笔风格
    //    pen.setStyle(Qt::DotLine);
    
    //    //让画家 使用这个笔
    //    painter.setPen(pen);
    
    //    //设置画刷
    //    QBrush brush(Qt::cyan);
    //    //设置画刷风格
    //    brush.setStyle(Qt::Dense1Pattern);
    
    //    //让画家使用画刷
    //    painter.setBrush(brush);
    
    //    //画线
    //    painter.drawLine(QPoint(0,0),QPoint(100,100));
    
    //    //画椭圆
    //    painter.drawEllipse(QPoint(100,100),50,50);
    
    //    //画矩形
    //    QPen pen2(QColor(125,125,125));
    //    painter.setPen(pen2);
    //    painter.drawRect(QRect(50,50,50,50));
    
    //    //画文字
    //    painter.drawText(QRect(10,200,150,150),"Hello,world");
    
    //    QPainter painter(this);
    //    painter.drawEllipse(QPoint(100,50),50,50);
    //    //设置 抗锯齿能力 效率低下
    //    painter.setRenderHint(QPainter::Antialiasing);
    //    painter.drawEllipse(QPoint(200,50),50,50);
    
    //    //画矩形
    //    painter.drawRect(20,120,50,50);
    
    //    //移动画家
    //    painter.translate(100,0);
    //    //保存画家状态
    //    painter.save();
    
    //    painter.drawRect(20,120,50,50);
    
    //    painter.translate(100,0);
    
    //    //还原画家保存状态
    //    painter.restore();
    
    //    painter.drawRect(20,120,50,50);
    
    QPainter painter(this);
    QPixmap qpixmap=   QPixmap(":/icon/demo01.png");
    if(pox>(this->width()-qpixmap.width())){
        pox=0;
    }
    painter.drawPixmap(pox,0,qpixmap);
}
Widget::~Widget()
{
    delete ui;
}

四、绘图设备

1、QPixmap

#include "widget.h"
#include "ui_widget.h"
#include<QPixmap>
#include<QPainter>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //Pixmap绘图设备
    QPixmap pix(300,300);

    //填充颜色
    pix.fill(Qt::white);

    //申明画家
    QPainter painter(&pix);
    painter.setPen(QPen(Qt::green));
    painter.drawEllipse(QPoint(150,150),100,100);

    //保存
    pix.save("E:\\pix.png");
}

Widget::~Widget()
{
    delete ui;
}

 2、QImage

#include "widget.h"
#include "ui_widget.h"
#include<QPixmap>
#include<QPainter>
#include<QImage>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

//    //Pixmap绘图设备
//    QPixmap pix(300,300);

//    //填充颜色
//    pix.fill(Qt::white);

//    //申明画家
//    QPainter painter(&pix);
//    painter.setPen(QPen(Qt::green));
//    painter.drawEllipse(QPoint(150,150),100,100);

//    //保存
//    pix.save("E:\\pix.png");

    QImage image(300,300,QImage::Format_ARGB32);

    //填充颜色
    image.fill(Qt::white);

    //申明画家
    QPainter painter(&image);
    painter.setPen(QPen(Qt::blue));
    painter.drawEllipse(QPoint(150,150),100,100);

    //保存
    image.save("E:\\image.png");
}

Widget::~Widget()
{
    delete ui;
}

修改像素点

#include "widget.h"
#include "ui_widget.h"
#include<QPixmap>
#include<QPainter>
#include<QImage>
#include<QRgb>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

//    //Pixmap绘图设备
//    QPixmap pix(300,300);

//    //填充颜色
//    pix.fill(Qt::white);

//    //申明画家
//    QPainter painter(&pix);
//    painter.setPen(QPen(Qt::green));
//    painter.drawEllipse(QPoint(150,150),100,100);

//    //保存
//    pix.save("E:\\pix.png");

    QImage image(300,300,QImage::Format_ARGB32);

    //填充颜色
    image.fill(Qt::white);

    //申明画家
    QPainter painter(&image);
    painter.setPen(QPen(Qt::blue));
    painter.drawEllipse(QPoint(150,150),100,100);

    //保存
    image.save("E:\\image.png");
}
void Widget::paintEvent(QPaintEvent *  ){
    QPainter painter(this);

    //利用QImage 对像素进行修改
    QImage img;
    img.load(":/icon/demo01.png");

    //修改像素点
    for(int i=50;i<100;i++){
        for(int j=50;j<100;j++){
            QRgb value=qRgb(255,0,0);
            img.setPixel(i,j,value);
        }
    }

    painter.drawImage(0,0,img);
}
Widget::~Widget()
{
    delete ui;
}

3、QPicture

    #include "widget.h"
#include "ui_widget.h"
#include<QPixmap>
#include<QPainter>
#include<QImage>
#include<QRgb>
#include<QPicture>
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    //    //Pixmap绘图设备
    //    QPixmap pix(300,300);

    //    //填充颜色
    //    pix.fill(Qt::white);

    //    //申明画家
    //    QPainter painter(&pix);
    //    painter.setPen(QPen(Qt::green));
    //    painter.drawEllipse(QPoint(150,150),100,100);

    //    //保存
    //    pix.save("E:\\pix.png");

    //    QImage image(300,300,QImage::Format_ARGB32);

    //    //填充颜色
    //    image.fill(Qt::white);

    //    //申明画家
    //    QPainter painter(&image);
    //    painter.setPen(QPen(Qt::blue));
    //    painter.drawEllipse(QPoint(150,150),100,100);

    //    //保存
    //    image.save("E:\\image.png");

    //QPicture 绘图设备 可以记录和重现绘图指令
    QPicture pic;
    QPainter painter;
    painter.begin(&pic);//开始画画
    painter.setPen(QPen(Qt::cyan));
    painter.drawEllipse(QPoint(150,150),100,100);
    painter.end();//结束画画

    //保存到磁盘
    pic.save("E:\\pic.cc");
}
void Widget::paintEvent(QPaintEvent *  ){
    //    QPainter painter(this);

    //    //利用QImage 对像素进行修改
    //    QImage img;
    //    img.load(":/icon/demo01.png");

    //    //修改像素点
    //    for(int i=50;i<100;i++){
    //        for(int j=50;j<100;j++){
    //            QRgb value=qRgb(255,0,0);
    //            img.setPixel(i,j,value);
    //        }
    //    }

    //    painter.drawImage(0,0,img);

    QPainter painter(this);
    //重现QPicture的绘图指令
    QPicture pic;
    pic.load("E:\\pic.cc");
    painter.drawPicture(0,0,pic);
}
Widget::~Widget()
{
    delete ui;
}

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

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

相关文章

XML系列篇之dtd约束

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于xml的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.XML 是什么 &#x1f4a1;辉辉小贴士&a…

STM32时钟系统

时钟 时钟是具有周期性的脉冲信号&#xff0c;最常用的是占空比50%的方波。 时钟是单片机的脉搏。 时钟树 HSE&#xff1a;高速外部振荡器&#xff0c;4~16MHz&#xff0c;&#xff08;晶体&#xff0c;陶瓷&#xff09;LSE&#xff1a;低速外部振荡器&#xff0c;32.768KHz…

ADC0808/ADC0809引脚图及功能和工作原理介绍

ADC0808芯片有28条引脚&#xff0c;采用双列直插式封装。如图所示&#xff1a; . . . 各引脚功能如下&#xff1a; 1-5和26-28&#xff08;IN0-IN7&#xff09;&#xff1a;8路模拟量输入端。 8、14、15和17-21&#xff1a;8位数字量输出端。 22&#xff08;ALE&#xff09…

深度学习代码环境配置(编译器, git, anaconda)

内容 编译器 gcc&#xff1a;GNU编译器套装C builderMicrosoft Visual C&#xff08;MSVC&#xff09;&#xff1a;微软的VC编译器MinGW&#xff08;Minimalist GNU on Windows&#xff09;&#xff1a;可自由使用和自由发布的Windows特定头文件和使用GNU工具集导入库的集合&…

【设计模式】面向对象的设计原则

(一) UML 和面向对象设计原则 1. 一种某唱片播放器不仅可以播放唱片&#xff0c;而且可以连接计算机并把计算机中的歌曲刻录到 唱片上&#xff08;同步歌曲&#xff09;。连接计算机的过程中还可自动完成充电。 关于唱片&#xff0c;还有如下描述信息&#xff1a; &#xf…

ChatGPT底层架构Transformer技术及源码实现(一)

ChatGPT底层架构Transformer技术及源码实现 Language Model底层的数学原理之最大似然估计MLE及最大后验概率MAP内部机制详解 Gavin大咖微信:NLP_Matrix_Space 传统人工智能算法的真相(The Truth Under Traditional AI Algorithms),传统人工智能算法是相对于贝叶斯(Bayesia…

【软件设计师暴击考点】程序设计语言-高频考点暴击系列

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;软件…

碳中和城市建筑能源系统(4):储能篇(龙惟定)2022

碳中和城市建筑能源系统(4):储能篇 摘要 本文是碳中和城市建筑能源系统系列文章的第四篇。在碳中和语境下&#xff0c;无论是增加可再生能源应用的渗透率&#xff0c;还是平抑负荷、提高电网的灵活性&#xff0c;都离不开储能。本文介绍了当今储能技术的主要类型&#xff0c;…

【新星计划·2023】Centos 7安装教程(一步一图)

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 一、下载VMware 二、下载镜像的方式 三、安装Linux ’前言 本文将讲解下载VMware和下载镜像的方式&#xff0c;以及安装centos 7的教…

webpack编译打包从入门到放弃

写在前面的话&#xff1a;推荐学习vite。当然&#xff0c;我更推荐你直接上手体验webpack_demo与vite_demo 看看他们的编译、打包、热更新速度等差距。你也可以直接通过vite开发lib库&#xff0c;一句话就是比webpack快&#xff0c;它有的vite都有&#xff0c;并且更好&#x…

NCI-NFCEE

10.5 NFCEE 状态 NFCC 使用此控制消息向 DH 通知启用的 NFCEE 状态的变化。 NFCC 发送 NFCEE_STATUS_NTF 来报告启用的 NFCEE 状态的变化。 对于任何禁用或无响应的 NFCEE&#xff0c;NFCC 不应发送 NFCEE_STATUS_NTF。 当启用 NFCEE 并且 NFCC 检测到与该 NFCEE 通信时存在不…

C++布隆过滤器

目录 布隆过滤器介绍实现哈希函数布隆过滤器删除 小结使用——题目 布隆过滤器 介绍 在许多场景下&#xff0c;如设置昵称时&#xff0c;往往要求唯一性。这时就需要高效判断该昵称是否被使用过。 使用红黑树的kv模型或者哈希表来组织昵称集合&#xff0c;可以&#xff0c;但缺…

Qt中的日期和时间

目录 QDate 示例&#xff08;打印年月日&#xff09;&#xff1a; QTime 示例&#xff08;显示时分秒&#xff09;&#xff1a; QDateTime 示例&#xff08;显示当前日期和时间&#xff09;&#xff1a; 示例&#xff08;分别取出 年 月 日 时 分 秒&#xff09;&#xff…

牛客网专项练习——C语言错题集(8)

文章目录 字符串拼接和拷贝while 与 fortypedef 和 define浮点类型的组成部分 字符串拼接和拷贝 这题并没有难度&#xff0c;但不知为什么我把该题空着。 strcpy 用于拷贝字符串&#xff0c;strcat 用于拼接字符串。 while 与 for 假如 i 0&#xff0c;while 循环里 s1 被执…

【AI机器学习入门与实战】机器学习算法都有哪些分类?

&#x1f44d;【AI机器学习入门与实战】目录 &#x1f36d;基础篇 &#x1f525; 第一篇&#xff1a;【AI机器学习入门与实战】AI 人工智能介绍 &#x1f525; 第二篇&#xff1a;【AI机器学习入门与实战】机器学习核心概念理解 &#x1f525; 第三篇&#xff1a;【AI机器学习入…

Z变换方程转化为差分方程

将Z变换方程转换为差分方程的过程称为反Z变换。反Z变换是将信号从复频域转换为时间域的过程。如果我们已知一个系统的传递函数&#xff0c;即Z变换方程&#xff1a; H ( z ) Y ( z ) X ( z ) b n b n − 1 z − 1 ⋯ b 0 z − n 1 a n a n − 1 z − 1 ⋯ a 0 z − n 0…

AVL 树

目录 AVL树的概念AVL树节点的定义AVL树的插入AVL树的旋转左单旋(parent->_bf 2 && cur->_bf 1)a,b,c当高度为0a,b,c当高度为1a,b,c当高度为2a,b,c当高度为...... 右单旋(parent->_bf -2 && cur->_bf -1)a,b,c当高度为0a,b,c当高度为1a,b,c当高…

强化学习从基础到进阶-案例与实践[4]:深度Q网络-DQN、double DQN、经验回放、rainbow、分布式DQN

【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧&#xff08;调参、画图等、趣味项目实现、学术应用项目实现 专栏详细介绍&#xff1a;【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧…

Azkaban初认识

Azkaban初认识 文章目录 Azkaban初认识Azkaban是什么&#xff1f;为什么需要工作流调度系统&#xff1f;常见的工作流调度系统Azkaban 与 Oozie的对比 Azkaban是什么&#xff1f; Azkaban是一个开源的分布式工作流管理器&#xff0c;在LinkedIn实施&#xff0c;以解决Hadoop作业…

RT-Thread-03-栈空间分配

栈空间分配 线程状态转换图&#xff1a; 系统滴答时钟 每个操作系统都存在一个系统时钟&#xff0c;是操作系统中最小的时钟单位。这个时钟负责系统和时间相关的一些操作。这个时钟由硬件定时器的定时中断产生。 系统时钟的频率需要根据芯片的处理能力来决定&#xff0c; 频…