Qt绘画的使用

news2025/2/22 19:14:23

 1. 绘图

绘图组件:

1、绘画对象

2、绘画位置

3、绘画工具

4、绘画时机

绘画时机:

当整个窗口或窗口的一部分需要重新绘制时,会调用绘制事件处理函数

void QWidget::paintEvent(QPaintEvent *event)

绘画对象:

QPainter类,就是Qt中进行绘图类

在QPainter类中存在各种绘制功能

绘画位置:

QPaintDevice类就是绘制的位置,是QPaintDevice类对象或派生类对象就是可以绘画的地方

绘制工具:

QPen:进行绘制图像的笔

QBrush:在绘制封闭图形时进行填充

1.2 举例

1.2.1 画直线,圆,矩形,画文本

paint

widget.h

//重写绘制事件处理函数
    //当整个窗口需要重新绘制的时候,就会调用此函数
    void paintEvent(QPaintEvent* event);

widget.cpp

//当整个窗口需要重新绘制的时候(比如刚刚创建出来,改变窗口大小时),就会调用此函数
void Widget::paintEvent(QPaintEvent *event){
    qDebug()<<"paintEvent"<<endl;

    //实例化绘画对象
    QPainter p(this);//QPainter 是Qt中进行绘图的类

    //绘制工具
    QPen pen1;//画笔
    QBrush brush1;//画刷

    pen1.setColor(Qt::white);//给画笔设置颜色为白色
//    pen1.setStyle(Qt::DashLine);//设置笔画出的样式(比如Qt::DashLine这个是虚线边框)

    brush1.setColor(Qt::white);//填充白色
    brush1.setStyle(Qt::SolidPattern);//填充样式也设置为白色

    //将绘画的笔设置给对象
    p.setPen(pen1);
    p.setBrush(brush1);

    //由对象完成绘制---我们画一个白色背景
    p.drawRect(0,0,this->width()*2/3,this->height());
    
    //绘制内容
    QPen pen2;
    pen2.setColor(Qt::blue);//设置笔的颜色
    pen2.setWidth(5);//设置笔的宽度
    p.setPen(pen2);//把笔给对象
    
        //画直线
    p.drawLine(start,end);//这里我们利用了鼠标的点击事件取出的起点和终点画一条直线

    // 画一个圆
    int radius = end.x()-start.x();  // 设置圆的半径
    QPoint center(end.x(),end.y());  // 设置圆心坐标
    p.drawEllipse(center, radius, radius);//这里有两个radius

    //画一个矩形
    p.drawRect(start.x(),start.y(),end.x()-start.x(),end.y()-start.y());

    //画文本
    p.drawText(50,50,text);

1.2.2 画图片

widget.cpp

    //画图片******************
    QPixmap pixmap("E:/peixunQianrushi/Qt/course/course7/paint/img/photo.jpg");
    //画一整张图片
    //p.drawPixmap(0,0,pixmap);
    //画一整张图片的矩形大小
    p.drawPixmap(QRect(0,0,this->width(),this->height()),pixmap);

1.2.3 多次绘制,并且之前的绘画还在

paint

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QDebug>
#include <QPainter>
#include <QMouseEvent>

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

    //鼠标按下事件
    void mousePressEvent(QMouseEvent *event);
    //鼠标松开事件
    void mouseReleaseEvent(QMouseEvent *event);
    //鼠标的移动事件
    void mouseMoveEvent(QMouseEvent *event);

private:
    Ui::Widget *ui;
    QPoint start;//鼠标按下起点
    QPoint end;//鼠标松开终点

    QList<QLine> line;//创建一个容器(其实时链表),用来存储画的线
    QList<QRect> rect;//存储化的矩形

    QString text;

};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //清空两个容器
    line.clear();
    rect.clear();
    text = "你好世界";
}

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

//当整个窗口需要重新绘制的时候(比如刚刚创建出来,改变窗口大小时),就会调用此函数
void Widget::paintEvent(QPaintEvent *event){
    qDebug()<<"paintEvent"<<endl;

    //实例化绘画对象
    QPainter p(this);//QPainter 是Qt中进行绘图的类

    //绘制工具
    QPen pen1;//画笔
    QBrush brush1;//画刷

    pen1.setColor(Qt::white);//给画笔设置颜色为白色
//    pen1.setStyle(Qt::DashLine);//设置笔画出的样式(比如Qt::DashLine这个是虚线边框)

    brush1.setColor(Qt::white);//填充白色
    brush1.setStyle(Qt::SolidPattern);//填充样式也设置为白色

    //将绘画的笔设置给对象
    p.setPen(pen1);
    p.setBrush(brush1);

    //由对象完成绘制---我们画一个白色背景
    p.drawRect(0,0,this->width()*2/3,this->height());//画一个矩形,前两个参数是坐标,后面的参数是长 高

    //画图片******************
    QPixmap pixmap("E:/peixunQianrushi/Qt/course/course7/paint/img/photo.jpg");
    //画一整张图片
    //p.drawPixmap(0,0,pixmap);
    //画一整张图片的矩形大小
    p.drawPixmap(QRect(0,0,this->width(),this->height()),pixmap);


    //绘制内容
    QPen pen2;
    pen2.setColor(Qt::blue);//设置笔的颜色
    pen2.setWidth(5);//设置笔的宽度
    p.setPen(pen2);//把笔给对象

    //画出之前的内容
    for(int i=0;i<line.size();i++){//画出之前的线
        p.drawLine(line.at(i));
    }
    for(int i=0;i<rect.size();i++){//画出之前的矩形
        // 设置透明的画刷
        p.setBrush(Qt::NoBrush);
        p.drawRect(rect.at(i));
    }

    //画出当前内容
    if(ui->comboBox->currentIndex()==0){//代表线
        p.drawLine(start,end);
    }else if(ui->comboBox->currentIndex()==1){ //代表矩形
        // 设置透明的画刷
        p.setBrush(Qt::NoBrush);
        p.drawRect(QRect(start,end));
    }

}

//鼠标按下事件
void Widget::mousePressEvent(QMouseEvent *event){
    start = event->pos();
}
//鼠标松开事件
void Widget::mouseReleaseEvent(QMouseEvent *event){
    end = event->pos();

    if(ui->comboBox->currentIndex()==0){
        //代表是线
        QLine l(start,end);
        line.append(l);
    }else if(ui->comboBox->currentIndex()==1){ //代表是矩形
        QRect r(start,end);
        rect.append(r);
    }
}

//鼠标的移动事件,我们也作为鼠标的终点(保证在绘画过程总也能正常显示我们画的东西)
void Widget::mouseMoveEvent(QMouseEvent *event){
    end = event->pos();

    update();//更新绘画的页面

}

2. 练习矩形截屏

test

mydialog.h

#ifndef MYDIALOG_H
#define MYDIALOG_H

#include <QDialog>

namespace Ui {
class MyDialog;
}

class MyDialog : public QDialog
{
    Q_OBJECT

public:
    explicit MyDialog(QWidget *parent = nullptr);
    ~MyDialog();

    // 添加一个成员变量用于保存图片
    void setScreenshot(const QPixmap& pixmap);

private:
    Ui::MyDialog *ui;
};

#endif // MYDIALOG_H

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QPaintEvent>
#include <QMouseEvent>
#include <QPoint>
#include <QPainter>
#include <QApplication>
#include <QDesktopWidget>
#include <mydialog.h>

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

    //鼠标按下事件
    void mousePressEvent(QMouseEvent* event);
    //鼠标松开事件
    void mouseReleaseEvent(QMouseEvent* event);
    //鼠标移动事件
    void mouseMoveEvent(QMouseEvent* event);


private slots:
    void on_pushButton_clicked();

private:
    Ui::Widget *ui;

    QPoint start;//鼠标按下
    QPoint end;//鼠标松开

    QList<QLine> line;//存储线
    QList<QRect> yuan;//存储圆

    QPixmap screenshot; // 存储截图

    int flag =0 ;//截屏标志位

};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

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

}

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

//绘画事件处理函数
void Widget::paintEvent(QPaintEvent *event){
    //实例化绘画对象
    QPainter p(this);

    //画图片
    QPixmap pixmap("E:/peixunQianrushi/Qt/course/course7/paint/img/photo.jpg");
    p.drawPixmap(QRect(0,0,this->width(),this->height()),pixmap);

    QPen pen1;
    pen1.setColor(Qt::red);
    pen1.setWidth(2);//设置笔的宽度

    p.setPen(pen1);

    //画矩形
    p.drawRect(QRect(start,end));

}

void Widget::mousePressEvent(QMouseEvent *event){
    start = event->pos();
}

void Widget::mouseReleaseEvent(QMouseEvent *event){
    end = event->pos();

    if(flag==1){//进行截屏


        int width = end.x()-start.x();
        int height = end.y()-start.y();

        //截取图片
        QPixmap screen = QPixmap::grabWidget(this, start.x(), start.y(), width, height);
        screenshot = screen;

        //调用新窗口
        MyDialog* mydialog = new MyDialog;

        mydialog->setScreenshot(screenshot);
        mydialog->show();
        update();

        flag = 0;
    }

}
void Widget::mouseMoveEvent(QMouseEvent *event){
    end = event->pos();
    update();
}

//点击进入截屏模式
void Widget::on_pushButton_clicked()
{
    flag = 1;
}


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

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

相关文章

java基础:求数组的最值

方法一&#xff1a;顺序查找 先假设数组第一个元素为最值&#xff0c;然后和数组里的数按顺序进行比较得出最值&#xff0c;所以叫顺序查找。 代码如下 package idea;public class arr_int {public static void main(String[] args) { // 初始化一个数组int[] arr {12…

【MYSQL】事务隔离级别

脏读、幻读、不可重复读 脏读 一个事务正在对一条记录做修改&#xff0c;在这个事务完成并提交前&#xff0c;另一个事务也来读取同一条记录&#xff0c;读取了这些未提交的“脏”数据&#xff0c;并据此做进一步的处理&#xff0c;就会产生未提交的数据依赖关系。这种现象被形…

渗透测试之Mimikatz2.2 如何抓取Win11登录明文密码

环境: 1.攻击者IP:192.168.1.35 系统: KALI2022(vmware 16.0) 2.靶机IP:192.168.1.16 系统: Windows11 3.USB无线网卡 4.Mimikatz 2.2 (win版) 问题描述: Mimikatz2.2 如何抓取Win11登录明文密码 解决方案: Wdigest WDigest协议是在WindowsXP中被引入的,旨在与H…

Kafka 消息不能正常消费问题排查

订单宽表数据不同步 事情的起因是专员在 ze app 上查不到订单了&#xff0c;而订单数据是从 mysql 的 order_search_info 查询的&#xff0c;order_search_info 表的数据是从 oracel 的 BZ_ORDER_INFO 表同步过来的&#xff0c;查不到说明同步有问题 首先重启&#xff0c;同步…

如何快速打造属于自己的接口自动化测试框架

1 接口测试 接口测试是对系统或组件之间的接口进行测试&#xff0c;主要是校验数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及相互逻辑依赖关系。 接口自动化相对于UI自动化来说&#xff0c;属于更底层的测试&#xff0c;这样带来的好处就是测试收益更大&#xff…

系统配置dns主从服务器

一、准备两台主机&#xff0c;区分主从 二、完全区域传送 1、主DNS服务器配置 #安装相关的包 [rootoula1 ~]# yum install bind -y#关闭防火墙 [rootoula1 ~]# systemctl stop firewalld [rootoula1 ~]# setenforce 0#修改配置主文件 [rootoula1 ~]# vim /etc/named.conf opt…

oop面向对象编程python

1.定义一个圆类&#xff08;Circle&#xff09;,求圆的面积和周长 import mathclass Circle():def __init__(self, R ,name):self.radius Rself.name namedef girth(self):return 2 * self.radius * math.pidef area(self):return self.radius ** 2 * math.pic1 Circle(10,&q…

全球移动通信市场,正在经历哪些新变化?

2023年已经结束了。回顾这一年的全球移动通信市场&#xff0c;如果让我用一个词来总结&#xff0c;那就是——“厚积薄发”。 从表面上来看&#xff0c;似乎并没有什么大事情发生。但实际上&#xff0c;平静的湖面之下&#xff0c;却是一片波涛汹涌、风云激荡。 无论是消费互联…

springcloud Eureka服务注册与发现

文章目录 代码地址Eureka基础知识什么是服务治理什么是服务注册与发现 单机版eurekaServerIDEA生成eurekaServer端服务注册中心类似物业公司EurekaClient端cloud-provider-payment8001修改EurekaClient端cloud-consumer-order80 集群Eureka构建步骤新建cloud-eureka-server7002…

Android平台Unity下如何通过WebCamTexture采集摄像头数据并推送至RTMP服务器或轻量级RTSP服务

技术背景 我们在对接Unity下推送模块的时候&#xff0c;遇到这样的技术诉求&#xff0c;开发者希望在Android的Unity场景下&#xff0c;获取到前后摄像头的数据&#xff0c;并投递到RTMP服务器&#xff0c;实现低延迟的数据采集处理。 在此之前&#xff0c;我们已经有了非常成…

Jxls 实现动态导出功能

目录 引言前端页面后端代码excel模板导出效果 引言 在实际做项目的过程中&#xff0c;导出报表时需要根据每个人所关注的点不一样&#xff0c;所需导出的字段也不一样&#xff0c;这时后端就需要根据每个所选的字段去相应的报表&#xff0c;这就是本文要讲的动态导出报表。 前端…

线程的使用

线程的创建方式 1、实现Runnable Runnable规定的方法是run()&#xff0c;无返回值&#xff0c;无法抛出异常 实现Callable 2、Callable规定的方法是call()&#xff0c;任务执行后有返回值&#xff0c;可以抛出异常 3、继承Thread类创建多线程 继承java.lang.Thread类&#xff0…

Docker registry镜像仓库,私有仓库及harbor管理详解

目录 registry镜像仓库概述 Docker 镜像仓库&#xff08;Docker Registry&#xff09;&#xff1a; registry 容器&#xff1a; 私有仓库概述 搭建本地私有仓库示例 Harbor概述 harbor架构 详解构成 Harbor由容器构成 Harbor部署示例 环境准备 部署Docker-Compose服…

uniapp中uview组件库的NoticeBar 滚动通知 使用方法

目录 #平台差异说明 #基本使用 #配置主题 #配置图标 #配置滚动速度 #控制滚动的开始和暂停 #事件回调 #API #Props #Events 该组件用于滚动通告场景&#xff0c;有多种模式可供选择 #平台差异说明 AppH5微信小程序支付宝小程序百度小程序头条小程序QQ小程序√√√√…

【不需要网络不需要显卡】本地部署GPT

【不需要网络/不需要显卡】本地部署GPT 大家好&#xff0c;我是老 J 我们都知道ChatGPT目前只有两种使用方式&#xff0c;一种是直接去官网访问&#xff0c;适合个人用户&#xff1b;另一种是API调用&#xff0c;适合企业或者网站使用。这两种方式的门槛都比较高&#xff0c;…

10个用于Android开发的有用的Kotlin库及示例

10个用于Android开发的有用的Kotlin库及示例 在Android开发领域&#xff0c;Kotlin已成为一门领先的语言&#xff0c;带来了现代语法和功能的浪潮。随着Kotlin的崛起&#xff0c;涌现出了许多专为其定制的库&#xff0c;进一步增强了开发体验。本文将深入介绍其中的10个库&…

【论文阅读】One For All: Toward Training One Graph Model for All Classification Tasks

目录 0、基本信息1、研究动机2、创新点——One For All &#xff1a;unique features3、准备4、具体实现4.1、用TAGs统一来自不同领域的图数据4.2、用NOI&#xff08;NODES-OF-INTEREST&#xff09;统一不同图任务4.2.1、NOI子图4.2.2、NOI提示结点 4.3、用于图的上下文学习&am…

Rust之构建命令行程序(三):重构改进模块化和错误处理

开发环境 Windows 10Rust 1.74.1 VS Code 1.85.1 项目工程 这次创建了新的工程minigrep. 重构改进模块化和错误处理 为了改进我们的程序&#xff0c;我们将修复与程序结构及其处理潜在错误的方式有关的四个问题。首先&#xff0c;我们的main函数现在执行两项任务:解析参数和…

Find My相机|苹果Find My技术与相机结合,智能防丢,全球定位

相机是一种利用光学成像原理形成影像并使用底片记录影像的设备&#xff0c;是用于摄影的光学器械。相机让我们能够记录下美丽的风景和珍贵的时刻。当我们到达一个迷人的地方,或者经历了一个特别难忘的时刻时,我们可以使用照相机来拍摄照片,记录下这些美好的回忆。照相机可以帮助…

最新 生成pdf文字和表格

生成pdf文字和表格 先看效果 介绍 java项目&#xff0c;使用apache的pdfbox工具&#xff0c;可分页&#xff0c;自定义列 依赖 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.22<…