Qt---绘图和绘图设备

news2024/12/23 4:34:35

一、QPainter绘图

绘图事件        void paintEvent()
声明一个画家对象,OPainter painter(this)        this指定绘图设备
画线、画圆、画矩形、画文字
设置画笔QPen        设置画笔宽度、风格

设置画刷QBrush        设置画刷风格

代码示例:

#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.setStyle(Qt::DotLine);

     //设置画笔宽度
     pen.setWidth(3);

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

     //设置画刷-->填充颜色
     QBrush brush(Qt::cyan);

     //设置画刷风格
     brush.setStyle(Qt::Dense7Pattern);

     //让画家使用画刷
     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.drawText(QRect(10,200,150,50),"好好学习,天天向上");
 }

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

输出如下所示:

 

二、QPainter高级设置

抗锯齿        效率低
painter.setRenderHint(QPainter::Antialiasing);

对画家进行移动
        painter.translate(100,0);

        保存状态save
        还原状态restore

代码示例: 

#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 *)
 {

     //高级设置///
     QPainter painter(this);
//     painter.drawEllipse(QPoint(100,50),50,50);
//     //设置抗锯齿能力  效率低
//     painter.setRenderHint(QPainter::Antialiasing);
//     painter.drawEllipse(QPoint(200,50),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();

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

 }

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

三、手动调用绘图事件

如果想手动调用绘图事件利用update()
利用画家画图片painter.drawPixmap( x, y,QPixmap(路飞))

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 *);

    int posX = 0;

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);

    //点击移动按钮,移动图片
    connect(ui->pushButton,&QPushButton::clicked,[=](){
        posX += 20;
        //如果要手动调用绘图事件 用update更新
        update();
    });
}

 void Widget::paintEvent(QPaintEvent *)
 {
     ///利用画家 画资源图片//
     QPainter painter(this);

     //如果超出屏幕从0开始
     if(posX > this->width())
     {
         posX = 0;
     }

     painter.drawPixmap(posX,0,QPixmap(":/image/Luffy.png"));
 }

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

输出如下所示:(当超出屏幕时从0开始)

利用定时器让其自动从左到右移动: 

#include "widget.h"
#include "ui_widget.h"
#include<QPainter>//画家类
#include<QTimer>

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

    //点击移动按钮,移动图片
    connect(ui->pushButton,&QPushButton::clicked,[=](){
        posX += 20;
        //如果要手动调用绘图事件 用update更新
        update();
    });

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

 void Widget::paintEvent(QPaintEvent *)
 {
     ///利用画家 画资源图片//
     QPainter painter(this);

     //如果超出屏幕从0开始
     if(posX > this->width())
     {
         posX = 0;
     }

     painter.drawPixmap(posX,0,QPixmap(":/image/Luffy.png"));
 }

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

四、绘图设备

1. QPixmap Qlmage QBitmap(黑白色) QPicture Qwidget

2. QPixmap对不同平台做了显示的优化
        QPixmap pix( 300,300)
        pix.fill(填充颜色)
        利用画家往pix 上画画        QPainter painter( & pix)

        保存pix.save(“路径")

3. Qimage可以对像素进行访问
        使用和QPixmap差不多 Qlmage img(300,300,Qlmage::Format_RGB32);

        其他流程和QPixmap一样
        可以对像素进行修改img.setPixel(i,j,value);

代码示例:

#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("D:\\QT\\pix.png");

    //QImage绘图设备    可以对像素进行访问
    QImage img(300,300,QImage::Format_RGB32);
    img.fill(Qt::white);

    QPainter painter(&img);
    painter.setPen(QPen(Qt::blue));
    painter.drawEllipse(QPoint(150,150),100,100);

    //保存
    img.save("D:\\QT\\img.png");
}

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

QPixmap和Qimage输出如下所示为:

                

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);
}

//绘图事件
void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);

    //利用QImage 对像素进行修改
    QImage img;
    img.load(":/image/Luffy.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;
}

输出对比如下所示: 

     

4. QPicture记录和重现绘图指令

        QPicture pic
        painter.begin(&pic);
        保存:pic.save(任意后缀名)

        重现:利用画家可以重现        painter.drawPicture(0,0,pic);

代码示例: 

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

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

    //QPicture绘图设备  可以记录和重现绘图指令
    QPicture pic;
    QPainter painter;
    painter.begin(&pic);//开始往pic上画

    painter.setPen(QPen(Qt::cyan));
    painter.drawEllipse(QPoint(150 ,150),100,100);

    painter.end();//结束画画

    //保存到磁盘
    pic.save("D:\\QT\\pic.zt");
}

//绘图事件
void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);

    //重现绘图指令
    QPicture pic;
    pic.load("D:\\QT\\pic.zt");
    painter.drawPicture(0,0,pic);
}

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

输出如下所示: 

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

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

相关文章

shell连接ubuntu上传文件失败,windows本地上传文件给linux失败

我直接用ubuntu上传文件失败 我用finalshell上传文件也失败 首先&#xff0c;我就觉得应该是我们的用户权限问题 所以我们从ubuntu用户换成root用户 sudo passwd root 设置我们的root用户的密码&#xff0c;我们这里就设置成root吧 然后&#xff0c;修改一下我们的文件 sudo…

数据挖掘(三)特征构造

前言 基于国防科技大学 丁兆云老师的《数据挖掘》课程 数据挖掘 数据挖掘&#xff08;一&#xff09;数据类型与统计 数据挖掘&#xff08;二&#xff09;数据预处理 3、特征构造 3.1 基本特征构造方法&#xff1a; 3.1.1 运用已有知识直接构造&#xff1a; 一般是根据原有…

Nurbs曲线

本文深入探讨了Nurbs曲线的概念、原理及应用&#xff0c;揭示了其在数字设计领域的独特价值和广泛影响。Nurbs曲线作为一种强大的数学工具&#xff0c;为设计师们提供了更加灵活、精确的曲线创建方式&#xff0c;从而极大地提升了设计作品的质感和表现力。文章首先介绍了Nurbs曲…

[FlareOn1]Bob Doge

[FlareOn1]Bob Doge Hint:本题解出相应字符串后请用flag{}包裹&#xff0c;形如&#xff1a;flag{123456flare-on.com} 得到的 flag 请包上 flag{} 提交。 密码&#xff1a;malware 没什么思路&#xff0c;原exe文件运行又install了一个challenge1.exe文件 c#写的&#xff…

618购物狂欢不知道怎么买?请收下这份好物清单,直接闭眼入!

在繁忙的618购物狂欢节来临之际&#xff0c;面对琳琅满目的商品&#xff0c;你是否感到无从下手&#xff1f;别担心&#xff0c;我们精心整理了一份好物清单&#xff0c;汇聚了各类热销与口碑兼具的精品。无论你是追求品质生活的消费者&#xff0c;还是寻找实惠好物的网购达人&…

618值得入手的数码产品怎么选?2024 买过不后悔的数码好物分享

在数字时代的浪潮中&#xff0c;每一次的购物狂欢节都如同一场科技盛宴&#xff0c;让我们有机会接触到最前沿、最实用的数码产品&#xff0c;而“618”无疑是这场盛宴中最为引人瞩目的日子之一。面对琳琅满目的商品&#xff0c;如何选择那些真正值得入手的数码好物&#xff0c…

社交媒体数据恢复:派派

派派是一款非常流行的社交软件&#xff0c;但是如果你在使用派派的过程中&#xff0c;不小心删除了一些重要的聊天记录或者其他数据&#xff0c;那么该怎么办呢&#xff1f;下面是一些简单的步骤&#xff0c;可以帮助你进行数据恢复。 1. 首先打开派派&#xff0c;并进入需要恢…

idea使用gitee基本操作流程

1.首先&#xff0c;每次要写代码前&#xff0c;先切换到自己负责的分支 点击签出。 然后拉取一次远程master分支&#xff0c;保证得到的是最新的代码。 写完代码后&#xff0c;在左侧栏有提交按钮。 点击后&#xff0c;选择更新的文件&#xff0c;输入描述内容&#xff08;必填…

深度解析Nginx:高性能Web服务器的奥秘(下)

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《洞察之眼&#xff1a;ELK监控与可视化》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、Nginx概述 二、Nginx核心功能 1、URL重写与重…

C语言易错提醒选择题精选

Ⅰ 易错题 1.设有double p;&#xff0c;为变量p声明一个引用名称rp,则定义语句为 double& rpp; 2.已知‘A’一‘Z’的ASCII码为65—90&#xff0c;当执行“char ch14*52&#xff1b;cout<<ch<<endl;”语句序列后得到的输出结H &#xff0c;72对应ASCII码中…

视觉SLAM十四讲:从理论到实践(Chapter3:三维空间刚体运动)

前言 学习笔记&#xff0c;仅供学习&#xff0c;不做商用&#xff0c;如有侵权&#xff0c;联系我删除即可 目标 理解三维空间的刚体运动描述方式&#xff1a;旋转矩阵、变换矩阵、四元数和欧拉角。掌握Eigen库的矩阵、几何模块的使用方法。 3.1 旋转矩阵 3.1.1 点、向量和…

详解xlsxwriter 操作Excel的常用API

我们知道可以通过pandas 对excel 中的数据进行处理分析&#xff0c;但是pandas本身对格式化数据方面提供了很少的支持&#xff0c;如果我们想对pandas进行数据分析后的数据进行格式化相关操作&#xff0c;我们可以使用xlsxwriter&#xff0c;本文就对xlsxwriter的常见excel格式…

一觉醒来 AI科技圈发生的大小事儿 05月13日

&#x1f4f3;博弈论让 AI 更加正确、高效&#xff0c;LLM 与自己竞争 研究团队设计了共识博弈&#xff0c;通过让语言模型的生成器和判别器相互博弈来提高模型的准确性和内部一致性。这种方法不需要对基础模型进行训练或修改&#xff0c;可以在笔记本电脑上快速执行。研究结果…

山洪灾害无线预警广播系统的主要设备和功能

一、背景 山洪泥石流是指在山区或者其他沟谷深壑&#xff0c;地形险峻的地区&#xff0c;因为暴雨、暴雪或其他自然灾害引发的洪水、山体滑坡并携带有大量泥沙以及石块的特殊洪流。山洪泥石流等地质灾害具有突然性以及流速快&#xff0c;流量大&#xff0c;物质容量大和破坏力…

C# SortedList 用法

文章目录 基本用法主要属性和方法注意事项 SortedList 的一些高级用法和注意事项。自定义排序规则线程安全性性能考量与其他集合的对比 SortedList 是 C# 中的一个集合类&#xff0c;它是一个键/值对集合&#xff0c;其中的键自动按顺序排序。这个类位于 System.Collections.G…

在Windows环境下安装CPU版的PyTorch

PytTorch是基于Python开发的&#xff0c;首先需要安装Python&#xff0c;Python的安装很简单&#xff0c;这里不再赘述。而 Windows用户能直接通过conda、pip和源码编译三种方式来安装PyTorch。 打开PyTorch官网&#xff08;PyTorch&#xff09;&#xff0c;在主页中根据自己的…

2024年NOC大赛创客智慧(西瓜创客)Python复赛编程真题模拟试卷包含答案

NOC复赛python模拟题 1.编写一个程序&#xff0c;提示用户输人一个矩形的长度和宽度&#xff0c;并输出其面积, 2.试计算在区间 1 到 n的所有整数中,数字x(0≤x≤9)共出现了多少次?例如在 1到11 中&#xff0c;即在 1,2,3.45,6.7,8.9,10,11 中&#xff0c;数字 1出现了 4 次.…

买货查窜货过程中的可能情况

控价除了要管控渠道中的低价、乱价链接外&#xff0c;还可能需要解决窜货问题&#xff0c;当窜货问题蔓延不及时解决时&#xff0c;渠道会越来越受影响&#xff0c;所以治理窜货也是控价过程中很重要的一步&#xff0c;窜货问题的治理多通过买货溯源来解决&#xff0c;买货要先…

关于LED的小事

基础知识 LED&#xff08;Light Emitting Diode&#xff09;是一种能够将电能转换为光能的发光二极管。LED的发明者是美国的物理学家罗伯特诺伊斯和化学家哈里贾斯特。LED的原理是利用半导体材料中的电子和空穴在禁带中产生复合&#xff0c;从而释放出光子&#xff0c;达到发光…

QLExpress入门及实战总结

文章目录 1.背景2.简介3.QLExpress实战3.1 基础例子3.2 低代码实战3.2.1 需求描述3.2.1 使用规则引擎3.3.2 运行结果 参考文档 1.背景 最近研究低代码实现后端业务逻辑相关功能&#xff0c;使用LiteFlow作为流程编排后端service服务, 但是LiteFlow官方未提供图形界面编排流程。…