Qt绘画的使用

 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_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic: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_OBJECTpublic: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_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic: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.rhkb.cn/news/240396.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

axios的原理及源码解析

面试官&#xff1a;你了解axios的原理吗&#xff1f;有看过它的源码吗&#xff1f; 一、axios的使用 关于axios的基本使用&#xff0c;上篇文章已经有所涉及&#xff0c;这里再稍微回顾下&#xff1a; 发送请求 import axios from axios;axios(config) // 直接传入配置 axio…

龙腾荆楚 | 软件供应链安全检测中心落地襄阳

1月16日&#xff0c;襄阳市东津新区“园区提质、企业满园”行动暨2024年东津云谷首月重大项目集中签约活动圆满完成&#xff0c;开源网安城市级项目再下一城&#xff0c;分别与襄阳市政府、高校、国投签订战略合作协议&#xff0c;推动荆楚地区数字政府、数字经济、数字社会、数…

阿里云 linux Centos7 安装 Miniconda3 + 创建Python环境

1.下载miniconda &#xff08;1&#xff09;法一&#xff1a;可以去下载清华源的miniconda镜像源&#xff0c;选择自己需要的版本&#xff0c;然后上传到Linux服务器上&#xff0c;linux上使用请选择linux版本&#xff0c;如下&#xff1a; &#xff08;2&#xff09;法二&…

vsc 不适用插件来更改背景图片

我之前看的教程都是推荐用的插件来修改 vsc 的背景&#xff0c;我感觉不稳定&#xff0c;不如自己来弄一个 那我们该如何操作呢&#xff0c;第一步先找到我们 vsc 的文件夹 依次进入 resources\app\out\vs\workbench 这个路径 就会看到 我们再新建一个文件夹 image&#xff…

银河麒麟操作系统 v10 中离线安装 Docker

银河麒麟操作系统 v10 中离线安装 Docker 1. 查看系统版本2. 查看 Linux 内核版本&#xff08;3.10以上&#xff09;3. 查看 iptabls 版本&#xff08;1.4以上&#xff09;4. 判断处理器架构5. 离线下载 Docker 安装包6. 移动解压出来的二进制文件到 /usr/bin 目录中7. 配置 Do…

AM5-DB低压备自投装置在河北冠益荣信科技公司洞庭变电站工程中的应用

摘 要&#xff1a;随着电力需求的不断增加&#xff0c;电力系统供电可靠性要求越来越高&#xff0c;许多供电系统已具备两回或多回供电线路。备用电源自动投入装置可以有效提高供电的可靠性&#xff0c;该类装置能够在工作电源因故障断开后&#xff0c;自动且迅速地将备用电源投…

Arm Generic Interrupt Controller v3 and v4(GICv3v4)学习(一)

提示 该博客主要为个人学习&#xff0c;通过阅读官网手册整理而来&#xff08;个人觉得阅读官网的英文文档非常有助于理解各个IP特性&#xff09;。若有不对之处请参考参考文档&#xff0c;以官网参考文档为准。 Arm Generic Interrupt Controller v3 and v4学习一共分为三章&…

Elasticsearch各种文档操作

本文来记录下Elasticsearch各种文档操作 文章目录 初始化文档数据查询所有文档匹配查询文档关键字精确查询文档多关键字精确查询文档字段匹配查询文档指定查询字段查询文档 初始化文档数据 在进行各种文档操作之前&#xff0c;我们先进行初始化文档数据的工作 查询所有文档 在 …

C++核心编程之通过类和对象的思想对文件进行操作

目录 ​​​​​​​一、文件操作 1. 文件类型分类&#xff1a; 2. 操作文件的三大类 二、文本文件 1.写文件 2.读文件 三、二进制文件 1.写二进制文件 2.读二进制文件 一、文件操作 程序运行时产生的数据都属于临时数据,程序一旦运行结束都会被释放 通过文件可以将…

【LV12 DAY17-18 中断处理】

GPX1_1是外部中断9 EINT9 查询可知其中断ID是57 所以需要进行人为修正lr的地址 sub lr&#xff0c;lr&#xff0c;#4 //iqr异常处理程序 irq_handler: //IRQ异常后LR保存的地址是被IRQ打断指令的下一条再下一条指令的地址&#xff0c;所以我们需要人为进行修正一下sub LR,L…

【北亚企安数据恢复】RAIDZ多块磁盘离线导致服务器崩溃的数据恢复案例

服务器数据恢复环境&#xff1a; ORACLE SUN ZFS某型号存储&#xff0c;共40块磁盘组建存储池&#xff0c;其中的36块磁盘分为三组&#xff0c;每组12块&#xff0c;单个组使用ZFS特有的RAIDZ管理所有磁盘&#xff0c;RAIDZ级别为2&#xff1b;另外的4块磁盘作为全局热备。存储…

DDDDDD

DDD 1、团队边界&#xff1a; 导购&#xff1a;负责用户的搜索和下单&#xff0c; 供应链负责机票的覆盖&#xff0c; 自营本身是一个商家&#xff08;一个企业&#xff09;&#xff0c;对供应链进行加工&#xff0c;在导购进行销售&#xff0c;主要负责收益、履约交付、财务方…

强化学习与监督学习【区别】

强化学习很强大&#xff0c;但是有大多数场景毫无使用它的必要&#xff0c;监督学习就够了。下面分析强化学习和监督学习的区别和强化学习有前景的应用。 目录 决策是否改变环境当前奖励还是长线回报总结 决策是否改变环境 监督学习假设模型的决策不会影响环境&#xff0c;而强…

【代码随想录07】344.反转字符串 541. 反转字符串II 05.替换空格 151.翻转字符串里的单词 55. 右旋转字符串

目录 344. 反转字符串题目描述做题思路参考代码 541. 反转字符串 II题目描述参考代码 05. 替换数字题目描述参考代码 151. 反转字符串中的单词题目描述参考代码 55. 右旋转字符串题目描述参考代码 344. 反转字符串 题目描述 编写一个函数&#xff0c;其作用是将输入的字符串反…

mac vscode latex实用

网上有教程怎么在vscode里安装macTex以及插件&#xff0c;然后就可以在latex里写代码了&#xff0c;这里需要修改的是对应的json文件&#xff0c;输入command P,可以看到最近打开的json设置文件&#xff0c;结果如下 然后设置这个json文件&#xff0c;我的json文件设置如下 …

three.js 点按钮,相机飞行靠近观察设备

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div class"box-right&quo…

oracle篇—19c新特性自动索引介绍

☘️博主介绍☘️&#xff1a; ✨又是一天没白过&#xff0c;我是奈斯&#xff0c;DBA一名✨ ✌✌️擅长Oracle、MySQL、SQLserver、Linux&#xff0c;也在积极的扩展IT方向的其他知识面✌✌️ ❣️❣️❣️大佬们都喜欢静静的看文章&#xff0c;并且也会默默的点赞收藏加关注❣…

Smart Tomcat

Smart Tomcat插件可以让idea图形化界面让代码部署到tomcat上达成一键打包部署的过程 下面是idea安装使用Smart Tomcat的过程 我们直接在plugins(插件)里搜索Tomcat 然后下载第一个 然后点击Apply(应用) 在一个项目中 第一次使用时要进行配置Smart Tomcat Name 可以不配置…

C# 基础入门

第二章 C# 语法基础 2-1 C# 中的关键字 关键字&#xff0c;是一些被C#规定了用途的重要单词。 在Visual Studio的开发环境中&#xff0c;关键字被标识为蓝色&#xff0c;下图代码中&#xff0c;用红方框圈出的单词就是关键字。 关键字 class &#xff0c;这个关键字的用途是…

使用 Elasticsearch 和 LlamaIndex 进行高级文本检索:句子窗口检索

2023 年是检索增强生成 (RAG) 的一年&#xff0c;人们探索了许多用例&#xff0c;并使用该技术开发了数百种产品。 从 Q/A 聊天机器人到基于上下文的代理&#xff0c;RAG 的使用一直是 LLM 申请快速增长的主要因素。 支持不断发展的社区以及 Langchain 和 LlamaIndex 等强大框架…