【Qt】8.QPainter、高级设置、手动调用绘图事件、绘图设备、文件操作、文件信息

news2024/12/23 23:03:17

目录

QPainter

代码

widget.h

widget.cpp

结果

高级设置

代码

widget.h

widget.cpp

结果

手动调用绘图事件

代码

widget.h

widget.cpp

结果

绘图设备

代码

widget.h

widget.cpp

结果

文件操作

代码

widget.cpp

结果

文件信息

代码

widget.cpp

结果

QPainter

  1. 绘图 事件 paintEvent

  2. QPainter painter(绘图设备this)

  3. draw..线圆 矩形 文字

  4. QPen设置笔宽度、样式,让画家用笔

  5. QBrush设置画刷样式,让画家用画刷

代码

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

private:
    Ui::Widget *ui;

public:
    //绘图事件
    void paintEvent(QPaintEvent *);
};
#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 *){
    //创建画家
    QPainter painter(this);

    //设置画笔颜色
    QPen pen(QColor(255,0,0));

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

    //设置笔风格
    pen.setStyle(Qt::DotLine);

    //画家用这支笔
    painter.setPen(pen);

    //画刷填充颜色
    QBrush brush(Qt::cyan);

    //让画家使用画刷
    brush.setStyle(Qt::Dense4Pattern);
    painter.setBrush(brush);

    //利用画家画画
    //画线
    painter.drawLine(QPoint(0,0),QPoint(20,20));

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

    //画椭圆
    painter.drawEllipse(QPoint(80,80),20,10);

    //画矩形
    painter.drawRect(QRect(100,100,200,150));

    //画字体
    painter.drawText(QRect(100,300,300,400),"你好,世界!");
}

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

结果

高级设置

  1. 抗锯齿painter.setRenderHint(QPainter:Antialiasing);

  2. 画家移动painter.translate(QPoint(100,0));

  3. 画家状态,存取

  4. save

  5. restore

代码

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

private:
    Ui::Widget *ui;

public:
    //绘图事件
    void paintEvent(QPaintEvent *);
};
#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 *){
    //创建画家
    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::Dense4Pattern);
    painter.setBrush(brush);

    //利用画家画画
    //画线
    painter.drawLine(QPoint(0,0),QPoint(20,20));

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

    //画椭圆
    painter.drawEllipse(QPoint(80,80),20,10);

    //画矩形
    painter.drawRect(QRect(100,100,200,150));

    //画字体
    painter.drawText(QRect(100,300,300,400),"你好,世界!");

    //高级设置
    painter.drawEllipse(QPoint(100,400),50,50);

    //设置抗锯齿,效率低
    painter.setRenderHint(QPainter::Antialiasing);
    painter.drawEllipse(QPoint(200,400),50,50);

    painter.drawRect(QRect(400,10,50,30));

    //移动画家
    painter.translate(QPoint(100,10));

    //保存状态
    painter.save();

    painter.drawRect(QRect(500,10,50,30));

    painter.translate(QPoint(100,10));

    //退出状态
    painter.restore();

    painter.drawRect(QRect(600,10,50,30));
}

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

结果

手动调用绘图事件

  1. update

  2. 画家可以画图片

  3. drawPixmap(x,y)

代码

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

private:
    Ui::Widget *ui;

public:
    //绘图事件
    void paintEvent(QPaintEvent *);
    int posX;
};
#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);

    //点击移动按钮,移动图片
    posX=400;
    connect(ui->pushButton,&QPushButton::clicked,[=](){
        posX=posX+10;

        //手动调用绘图事件
        update();
    });
}

//绘图事件
void Widget::paintEvent(QPaintEvent *){
    //创建画家
    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::Dense4Pattern);
    painter.setBrush(brush);

    //利用画家画画
    //画线
    painter.drawLine(QPoint(0,0),QPoint(20,20));

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

    //画椭圆
    painter.drawEllipse(QPoint(80,80),20,10);

    //画矩形
    painter.drawRect(QRect(100,100,200,150));

    //画字体
    painter.drawText(QRect(100,300,300,400),"你好,世界!");

    //高级设置
    painter.drawEllipse(QPoint(100,400),50,50);

    //设置抗锯齿,效率低
    painter.setRenderHint(QPainter::Antialiasing);
    painter.drawEllipse(QPoint(200,400),50,50);

    painter.drawRect(QRect(400,10,50,30));

    //移动画家
    painter.translate(QPoint(100,10));

    //保存状态
    painter.save();

    painter.drawRect(QRect(500,10,50,30));

    painter.translate(QPoint(100,10));

    //退出状态
    painter.restore();

    painter.drawRect(QRect(600,10,50,30));

    //画图片
    if(posX>this->width()){//如果出屏幕,变回400
        posX=400;
    }
    painter.drawPixmap(posX,50,QPixmap(":/TuPian/a1.png"));
}

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

结果

绘图设备

  1. QPixmap、QBitMap(黑白色)、Qlmage、QPicture、QWidget

  2. QPixmap

  3. 创建对象QPixmap pix (w,h)

  4. fil填充色

  5. 保存save

  6. Qimage img (w,h,format)设置像素setPixele

  7. QPicture重现记录,绘图指令,后缀

代码

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

private:
    Ui::Widget *ui;

public:
    //绘图
    void paintEvent(QPaintEvent *);
};
#endif // WIDGET_H

widget.cpp

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

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

    //QPixmap做绘图设备,对不同平台显示做了优化
    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("/home/cet/Qt/JiaoCheng/14/14/pix.png");

    //QImage做绘图设备,对像素级访问进行了优化
    QImage img(300,300,QImage::Format_RGB32);
    img.fill(Qt::white);
    QPainter painter2(&img);
    painter2.setPen(QPen(Qt::blue));
    painter2.drawEllipse(QPoint(150,150),100,100);
    img.save("/home/cet/Qt/JiaoCheng/14/14/img.png");

    //QPicture绘图设备
    QPicture pic;//用于重现,记录绘图指令
    QPainter painter3;
    painter3.begin(&pic);

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

    painter3.end();

    //保存
    pic.save("/home/cet/Qt/JiaoCheng/14/14/pic.zt");
}

void Widget::paintEvent(QPaintEvent *){
    //QImage可修改像素
    QImage img;
    img.load(":/TuPian/a1.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);
        }
    }

    QPainter painter(this);
    painter.drawImage(QPoint(0,0),img);

    //重现绘图指令QPicture
    QPicture pic;
    pic.load("/home/cet/Qt/JiaoCheng/14/14/pic.zt");
    QPainter painter2(this);
    painter2.drawPicture(0,0,pic);
}

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

结果

 

 

文件操作

  1. QFile file(路径)

  2. file.open打开方式 QIODevice: : ReadOnly

  3. file.readAll readLine(file.atEnd判断是否到文件尾)

  4. 写QlODevice:: WriteUnlye

  5. file.write("...")

代码

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QMessageBox>
#include <QFile>

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

    //点击按钮,选取文件
    connect(ui->pushButton,&QPushButton::clicked,[=](){
        QString path=QFileDialog::getOpenFileName(this,"打开文件","/home/cet/Qt/JiaoCheng/15");
        if(path.isEmpty()){
            QMessageBox::warning(this,"警告","打开失败");
        }
        else{
            //将路径放入到lineEdit
            ui->lineEdit->setText(path);

            //读取文件,QFile默认支持UTF-8格式
            QFile file(path);//参数路径名称

            //指定打开方式,只读
            file.open(QFileDevice::ReadOnly);

            QByteArray array;
            array=file.readAll();

            //设置到文本编辑框中
            ui->textEdit->setText(array);
            file.close();

            //写文件,重新指定打开方式
            file.open(QFileDevice::Append);
            file.write("踩踩踩踩踩");
            file.close();
        }
    });
}

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

结果

文件信息

  1. QFilelnfo info

  2. info 读取到文件信息

  3. 路径、名称、后缀名、大小

  4. 创建日期、修改日期 QDateTime toString("yyyy-MM...")

代码

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QFileDialog>
#include <QMessageBox>
#include <QFile>
#include <QFontInfo>
#include <QDebug>
#include <QDateTime>

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

    //点击按钮,选取文件
    connect(ui->pushButton,&QPushButton::clicked,[=](){
        QString path=QFileDialog::getOpenFileName(this,"打开文件","/home/cet/Qt/JiaoCheng/15");
        if(path.isEmpty()){
            QMessageBox::warning(this,"警告","打开失败");
        }
        else{
            //将路径放入到lineEdit
            ui->lineEdit->setText(path);

            //读取文件,QFile默认支持UTF-8格式
            QFile file(path);//参数路径名称

            //指定打开方式,只读
            file.open(QFileDevice::ReadOnly);

            QByteArray array;
            array=file.readAll();

            //设置到文本编辑框中
            ui->textEdit->setText(array);
            file.close();

            //写文件,重新指定打开方式
            /*file.open(QFileDevice::Append);
            file.write("踩踩踩踩踩");
            file.close();*/

            //通过QFileInfo读取文件信息
            QFileInfo info(path);
            qDebug()<<"路径:"<<info.filePath();
            qDebug()<<"名称:"<<info.fileName();
            qDebug()<<"文件大小:"<<info.size();
            qDebug()<<"后缀名:"<<info.suffix();
            qDebug()<<"创建日期:"<<info.created().toString("yyyy-MM-dd hh:mm:ss");
            qDebug()<<"修改日期:"<<info.lastModified().toString("yyyy/MM/dd hh:mm:ss");
        }
    });
}

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

结果

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

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

相关文章

一文带你看懂健康管理系统----IPMI

目录 1. IPMI概述 2. IPMI系统设计 3. 主BMC模块设计 5. 从IPMI模块设计 6. 名词解释 6. 代码 1. IPMI概述 智能平台管理接口&#xff08;IPMI&#xff1a;Intelligent Platform Management Interface&#xff09;是一项应用于服务器管理系统设计的标准&#xff0c;由Int…

BSN-DDC基础网络详解(一):基础介绍

BSN-DDC基础网络推出已经一年了&#xff0c;得到了行业应用方和广大开发者的高度认可。一年中BSN产品技术团队也在根据市场业务需求不断更新功能服务&#xff0c;我们将通过本系列文章为大家系统化介绍DDC网络的功能和使用&#xff0c;为感兴趣的朋友提供学习帮助。BSN-DDC基础…

历史与今日的事件

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 1.2023年1月31日中国最新量子计算机“悟空”即将问世&#xff0c…

【34】C语言 | 动态内存管理

目录 1.为什么存在动态内存分配 2、动态内存函数的介绍 2.1 malloc和free 2.2 calloc 2.3 realloc 1.为什么存在动态内存分配 我们已经掌握的内存开辟方式有: int val 20; //在栈空间上开辟四个字节 char arr[n] {0}; //在栈空间上开辟10个节的连续空间 但是上述的开辟…

mPEG-SS-NHS甲氧基聚乙二醇-二硫键-琥珀酰亚胺酯

mPEG-SS-NHS甲氧基聚乙二醇-双硫键-活性酯 名称&#xff1a;甲氧基聚乙二醇-双硫键-琥珀酰亚胺酯 英文名称&#xff1a;mPEG-SS-NHS 存储条件&#xff1a;-20C&#xff0c;避光&#xff0c;避湿 用 途&#xff1a;仅供科研实验使用&#xff0c;不用于诊治 外观: 固体或粘性…

【c语言进阶】动态通讯录

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a; c语言学习 &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对我…

彭博:预订量未及预期,索尼大幅削减PS VR2首季订单

在索尼VR新品&#xff1a;PS VR2正式发货前夕&#xff0c;彭博社爆料称&#xff1a;因预订量不及预期&#xff0c;索尼已经大幅削减PS VR2首季订单量。消息人士称&#xff0c;索尼PS VR2发布后首个季度的订单目标是200万台&#xff0c;现已根据预订量减半&#xff0c;至约100万…

iOS 视频播放器开发

需求设计 做一个小学生教育辅导视频播放器。 参考小猿搜题视频播放器 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L0GsyFSt-1675164972791)(https://tva1.sinaimg.cn/large/008vxvgGgy1h9xk4fm5xfj31sx0u0mz0.jpg)] [外链图片转存失败,源站可…

Java中的JCA对基于密码的加密进行成功的蛮力搜索攻击所需的时间估计

对于JCA中基于密码的DES加密实现&#xff0c;固定一些盐和迭代计数&#xff0c;并记录加密/解密所需的平均时间;估计成功进行蛮力搜索攻击所需的时间Name: NIHAO DONG Number: 201476606 Password List:N Password 1 P$$W0rD 2 thisismypassword 3 VeryLongP$$W0rD fi…

[0CTF 2016]piapiapia(字符逃逸详解)

目录 知识点 信息收集 尝试SQL注入 源码目录扫描 代码审计 payload生成 知识点 信息泄露参数传递数组绕过字符串检测反序列化字符逃逸 信息收集 收集到了一只超可爱的小喵 尝试SQL注入 用户名不存在的回显 密码无效的回显 用户存在&#xff0c;密码错误的回显 判断闭…

STC15系列PWM功能相关功能寄存器介绍

STC15系列PWM功能相关功能寄存器介绍✨以下数据来源于stc15手册。 &#x1f4d3;增强型PWM波形发生器相关功能寄存器总表 1. 端口配置寄存器&#xff1a;P_SW2 2.PWM配青寄存器:PWMICFG CBTADC: PWM计数器归零时 (CBIF1时) 触发ADC转换 – 0:PWM计数器归零时不触发ADC转换 – …

Web3中文|亚马逊进入web3,将在春季推出NFT计划

亚马逊正向加密行业迈出第一步。 根据Blockworks 1月26日发布的报告&#xff0c;这家电子商务巨头计划在2023年春天推出一项专注于区块链游戏和相关NFT的计划。 该计划仍处于开发阶段&#xff0c;但发布的最后期限定为4月。亚马逊用户将可以体验基于区块链的游戏并领取免费的…

Python采集某乎专栏文章保存成pdf

前言 大家早好、午好、晚好吖 ❤ ~ 环境使用: Python 3.8 Pycharm wkhtmltopdf 软件 --> 文章下方名片信领取 模块使用: requests >>> pip install requests 数据请求 parsel >>> pip install parsel 数据解析 re >>> 内置模块 不需要安装…

域内委派攻击

域委派是指&#xff0c;将域内用户的权限委派给服务账号&#xff0c;使得服务账号能以用户权限开展域内活动。利用委派可获取域管理员权限 域委派主要分为三种&#xff1a; 非约束性委派 约束性委派 基于资源的约束性委派 在Windows系统中&#xff0c;只有服务账号和主机账号…

操作系统权限提升(五)之系统错误配置-PATH环境变量提权

系列文章 操作系统权限提升(一)之操作系统权限介绍 操作系统权限提升(二)之常见提权的环境介绍 操作系统权限提升(三)之Windows系统内核溢出漏洞提权 操作系统权限提升(四)之系统错误配置-Tusted Service Paths提权 注&#xff1a;阅读本编文章前&#xff0c;请先阅读系列文章…

寻找整数

问题描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 有一个不超过 10^{17}1017 的正整数 nn,知道这个数除以 2 至 49 后的余数如下表所示,求这个正整数最小是多少。 运行限制 最大运行时间:1s最大运行内存: 512M参考答案 mp = {2: 1, …

虹科动态 | 虹科HSR/PRP IP核现已支持HSR/PRP最新标准

HSR与PRP是专注于解决高可靠性自动化网络传输的技术&#xff0c;其所属的国际标准为IEC 62439。最初&#xff0c;IEC发布此项标准主要目的是为了满足IEC 61850-5中所提到的变电站自动化应用中各通信组件或服务故障所要求的恢复时间问题&#xff0c;但协议设计时的通用性&#x…

PTA L1-017 到底有多二

前言&#xff1a;本期是关于到底有多二的详解&#xff0c;内容包括四大模块&#xff1a;题目&#xff0c;代码实现&#xff0c;大致思路&#xff0c;代码解读&#xff0c;今天你c了吗&#xff1f; 题目&#xff1a; 一个整数“犯二的程度”定义为该数字中包含2的个数与其位数…

Java多线程:Future和FutureTask

一、Future Future是一个接口&#xff0c;所有方法如下&#xff1a; 上源码&#xff1a; package java.util.concurrent; public interface Future<V> {boolean cancel(boolean mayInterruptIfRunning);boolean isCancelled();boolean isDone();V get() throws Interru…

5.3 场效应管的高频等效模型

由于场效应管各级之间存在极间电容&#xff0c;因而其高频响应与晶体管相似。根据场效应管的结构&#xff0c;可得出图5.3.1(a)所示的高频等效模型&#xff0c;大多数场效应管的参数如表1所示。由于一般情况下 rgsr_{gs}rgs​ 和 rdsr_{ds}rds​ 比外接电阻大得多&#xff0c;因…