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.mzph.cn/news/632067.shtml

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

相关文章

群晖Drive搭建云同步服务器结合内网穿透实现Obsidian笔记文件远程多端同步

文章目录 一、简介软件特色演示&#xff1a; 二、使用免费群晖虚拟机搭建群晖Synology Drive服务&#xff0c;实现局域网同步1 安装并设置Synology Drive套件2 局域网内同步文件测试 三、内网穿透群晖Synology Drive&#xff0c;实现异地多端同步Windows 安装 Cpolar步骤&#…

使用内网穿透解决电信无公网IP难题,神卓互联

事情经过 事情是这样的&#xff0c;由于客户的单位通了电信宽带&#xff0c;然后采购了我们的ERP系统安装在单位的服务器上&#xff0c;在单位的时候可以通过输入服务器的局域网Ip地址访问&#xff0c;也就是192.168.2.1xx这样的地址&#xff0c;访问确实没有问题&#xff0c;…

【漏洞复现】Sentinel Dashboard默认弱口令漏洞

Nx01 产品简介 Sentinel Dashboard是一个轻量级的开源控制台&#xff0c;提供机器发现以及健康情况管理、监控、规则管理和推送的功能。它还提供了详细的被保护资源的实际访问统计情况&#xff0c;以及为不同服务配置的限流规则。 Nx02 漏洞描述 Sentinel Dashboard存在默认弱…

墙地砖外形检测的技术方案-外部轮廓检测算法

Ramer算法 利用Canny算子得到墙地砖轮廓后&#xff0c;必须进一步将轮廓线精确分段成墙地砖的四条边&#xff0c;从而可得到墙地砖轮廓尺寸、边直度和直角度指标。采用如下算法实现&#xff1a; 第1&#xff0c;选择较高阈值&#xff0c;利用ramer算法将轮廓线用多边形&#…

软件测试|Python 用户输入和字符串格式化

简介 在 Python 中&#xff0c;用户输入和字符串格式化是编程中常见的任务之一。用户输入使我们能够与用户交互&#xff0c;而字符串格式化帮助我们创建美观的输出。本文将介绍如何在 Python 中执行这些任务&#xff0c;并提供详细示例。 用户输入 在 Python 中&#xff0c;…

[论文阅读]DeepFusion

DeepFusion Lidar-Camera Deep Fusion for Multi-Modal 3D Object Detection 用于多模态 3D 物体检测的激光雷达相机深度融合 论文网址&#xff1a;DeepFusion 论文代码&#xff1a;DeepFusion 摘要 激光雷达和摄像头是关键传感器&#xff0c;可为自动驾驶中的 3D 检测提供补…

多输入多输出 | Matlab实现PSO-CNN粒子群优化卷积神经网络多输入多输出预测

多输入多输出 | Matlab实现PSO-CNN粒子群优化卷积神经网络多输入多输出预测 目录 多输入多输出 | Matlab实现PSO-CNN粒子群优化卷积神经网络多输入多输出预测预测效果基本介绍模型背景程序设计参考资料 预测效果 基本介绍 Matlab实现PSO-CNN粒子群优化卷积神经网络多输入多输出…

ONLYOFFICE:开源、免费、安全,打造定制化办公平台的最佳选择

文章目录 写在前面ONLYOFFICE是什么&#xff1f;ONLYOFFICE的惊艳之处齐全的插件&#xff0c;助你锦上添花部署一款自己的安全可靠的办公平台写在最后 写在前面 说起 Office 办公软件&#xff0c;我想大家最常用的应该就是微软的 Microsoft Office 以及国产的 WPS Office。两款…

349. 两个数组的交集(力扣)(OJ题)

题目链接&#xff1a;349. 两个数组的交集 - 力扣&#xff08;LeetCode&#xff09; 个人博客主页&#xff1a;https://blog.csdn.net/2301_79293429?typeblog 专栏&#xff1a;https://blog.csdn.net/2301_79293429/category_12545690.html 给定两个数组 nums1 和 nums2 &a…

具有中国特色的普及工厂数字化转型的新路子

工业互联网浪潮来袭&#xff0c;你准备好了吗&#xff1f; 国家智能制造专委会委员、浙江省智能制造专家委员会毛光烈主任在“第七届中国工业大数据大会”上的演讲&#xff0c;《具有中国特色的普及工厂数字化转型的新路子》&#xff0c;阐述了关于工厂订单全流程业务数据体系运…

Scrapy配置文件设置(全网最全)

Scrapy配置设置(全网最全&#xff09;&#xff1a; 背景&#xff1a; ​ 之前在做爬虫项目的时候&#xff0c;老报错或有问题&#xff0c;我看了网上很多文章&#xff0c;但是都不是很全面&#xff0c;在这里写一篇博客给大家讲讲scrapy文件中的setting.py文件&#xff0c;我…

每周一算法:数独游戏

题目链接 数独游戏 题目描述 数独是根据 9 9 9 \times 9 99 盘面上的已知数字&#xff0c;推理出所有剩余空格的数字&#xff0c;并满足每一行、每一列、每一个粗线宫内的数字均含 1 − 9 1 - 9 1−9 &#xff0c;不重复。每一道合格的数独谜题都有且仅有唯一答案&#x…

align-item 和 align-content

align-item 和 align-content flex 布局中的 align-items 和 align-content 属性都用于垂直对齐 flex 容器内的项目&#xff0c;但它们适用于不同的情况&#xff1a; align-items: 这个属性用于在交叉轴上对齐单行内的 flex 项目。当你有一个 flex 容器&#xff0c;并且里面的…

通信入门系列——信号的频谱分析

一、信号频谱 信号的频谱&#xff0c;指的是一段频率范围内的情况&#xff0c;信号的幅度和相位的情况。 以一个频率为1Hz的余弦电压信号进行说明&#xff0c;这个信号的傅里叶变换为X(ω)πδ(ω-2π)πδ(ω2π)&#xff0c;也就是所谓的频谱密度&#xff0c;单位为V/(rad/…

vue3-表单输入绑定

表单输入绑定 获取表单输入的值方式&#xff1a; 手动连接值绑定和更改事件监听器 v-model 指令 &#xff08;常用&#xff09; <script lang"ts" setup> import { ref } from "vue" // 定义个变量接收输入的内容&#xff1a; const text ref(&…

PMP冲突解决策略:项目经理的必备技能

原创不易&#xff0c;你们的点赞收藏是我创作的动力&#xff01; 在项目管理领域&#xff0c;冲突是不可避免的现象。作为项目经理&#xff0c;掌握有效的冲突解决策略至关重要。本文将为您详细介绍PMP&#xff08;项目管理专业&#xff09;中常用的几种冲突解决策略&#xff…

rviz可视化机械臂(python)

一、准备的东西 一个机械臂的urdf 规划的路径点 二、launch文件的撰写 1.初始化 <?xml version"1.0" encoding"utf-8"?> <launch><param name"robot_description" textfile"机械臂.urdf" /><node name&qu…

Kotlin-控制流程

&#x1f4d1;前言 本文主要是【Kotlin】——Kotlin-控制流程的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304;每日一句…

mac下配置git自定义快捷命令

1. 指定自定义别名 vi ~/.bash_profile open ~/.bash_profile 配置环境变量,插入类似下面的内容 .bash_profile文件 alias gcgit checkout alias gmgit commit -m alias gcbgit checkout -balias gtgit statusalias gagit add .alias glggit logalias gdgit diffalias gr…

mysql安装及部署

1.在/usr/local下创建mysql目录 cd /usr/local mkdir /mysql 2.在mysql目录中下载 cd mysql/ wget https://cdn.mysql.com/archives/mysql-8.0/mysql-8.0.34-1.el9.x86_64.rpm-bundle.tar 3.解压 tar xvf mysql-8.0.34-1.el9.x86_64.rpm-bundle.tar 4.安装 dnf localinst…