摘要

最近碰到了一个需要在qt中完成二维图像变换的作业,想到刚接触qt时学过qpainter来进行绘画操作,立马就着手码起来;作为一个小白,马上就发现了相应的问题:由于qt内部机制,绘画事件(paintEvent)仅允许在绘画事件下进行(比如我想在某个按钮槽函数下绘画是错误的。查阅了论坛上大部分文章发现很少涉及这样的操作,并且涉及到的操作对于我这种小白来说也是比较难的。

在一晚上的思考下,突然想起可以通过枚举来解决这问题,下面要介绍的就是通过枚举来实现自定义操作“画家的笔”。

代码

widget.h

#include <QWidget>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void paintEvent(QPaintEvent *event);signals:void senddata();private slots:void on_pushButton_clicked();private:Ui::Widget *ui;
};

头文件声明绘图事件,之后再重写

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include<QPainter>
#include<QMessageBox>double X1,Y1,X2,Y2,X3,Y3;enum func
{ok,pingyi1,pingyi2,pingyi3,pingyi4,xuanzhuan,duicheng,fangsuo,}func1;Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);setWindowTitle("图形变换");resize(800,600);//确定connect(ui->pushButton,&QPushButton::clicked,this,[=](){X1=ui->lineEdit->text().toDouble();Y1=ui->lineEdit_2->text().toDouble();X2=ui->lineEdit_3->text().toDouble();Y2=ui->lineEdit_4->text().toDouble();X3=ui->lineEdit_5->text().toDouble();Y3=ui->lineEdit_6->text().toDouble();if(ui->lineEdit->text().isEmpty()||ui->lineEdit_2->text().isEmpty()||ui->lineEdit_3->text().isEmpty()||ui->lineEdit_4->text().isEmpty()||ui->lineEdit_5->text().isEmpty()||ui->lineEdit_6->text().isEmpty()){QMessageBox::warning(this,"注意!","请输入正确的数据");}else{func1 = ok;update();}});//上移connect(ui->pushButton_2,&QPushButton::clicked,this,[=](){func1=pingyi1;Y1=Y1+20;Y2=Y2+20;Y3=Y3+20;update();});//下移connect(ui->pushButton_6,&QPushButton::clicked,this,[=](){func1=pingyi2;Y1=Y1-20;Y2=Y2-20;Y3=Y3-20;update();});//左移connect(ui->pushButton_7,&QPushButton::clicked,this,[=](){func1=pingyi3;X1=X1-20;X2=X2-20;X3=X3-20;update();});//右移connect(ui->pushButton_8,&QPushButton::clicked,this,[=](){func1=pingyi4;X1=X1+20;X2=X2+20;X3=X3+20;update();});//旋转connect(ui->pushButton_3,&QPushButton::clicked,this,[=](){func1=xuanzhuan;double temp1,temp2,temp3;temp1=X1*cos(0.523)-Y1*sin(0.523);Y1=X1*sin(0.523)+Y1*cos(0.523);X1=temp1;temp2=X2*cos(0.523)-Y2*sin(0.523);Y2=X2*sin(0.523)+Y2*cos(0.523);X2=temp2;temp3=X3*cos(0.523)-Y3*sin(0.523);Y3=X3*sin(0.523)+Y3*cos(0.523);X3=temp3;update();});//放缩connect(ui->pushButton_4,&QPushButton::clicked,this,[=](){func1=fangsuo;X1=X1*0.75;Y1=Y1*0.75;X2=X2*0.75;Y2=Y2*0.75;X3=X3*0.75;Y3=Y3*0.75;update();});//对称connect(ui->pushButton_5,&QPushButton::clicked,this,[=](){func1=duicheng;Y1=-Y1;Y2=-Y2;Y3=-Y3;update();});}void Widget::paintEvent(QPaintEvent *event)
{Q_UNUSED(event);QPainter painter(this);// 反走样painter.setRenderHint(QPainter::Antialiasing, true);// 设置画笔颜色painter.setPen(QColor(0, 160, 230));//绘制绘图框painter.drawRect(QRect(QPoint(0,0),QPoint(height(),width()-100)));// 绘制直线painter.setPen(QColor(0, 0, 0));painter.drawLine(QLine(QPoint(height()/2,0),QPoint(height()/2,width()-100)));painter.drawLine(QLine(QPoint(0,(width()-100)/2),QPoint(height(),(width()-100)/2)));painter.translate(height()/2,(width()-100)/2);//重新设置坐标轴原点painter.scale(1,-1);//反转Y轴switch (func1) {case ok:painter.drawLine(QLine(QPoint(X1,Y1),QPoint(X2,Y2)));painter.drawLine(QLine(QPoint(X2,Y2),QPoint(X3,Y3)));painter.drawLine(QLine(QPoint(X1,Y1),QPoint(X3,Y3)));break;case pingyi1:painter.drawLine(QLine(QPoint(X1,Y1),QPoint(X2,Y2)));painter.drawLine(QLine(QPoint(X2,Y2),QPoint(X3,Y3)));painter.drawLine(QLine(QPoint(X1,Y1),QPoint(X3,Y3)));break;case pingyi2:painter.drawLine(QLine(QPoint(X1,Y1),QPoint(X2,Y2)));painter.drawLine(QLine(QPoint(X2,Y2),QPoint(X3,Y3)));painter.drawLine(QLine(QPoint(X1,Y1),QPoint(X3,Y3)));break;case pingyi3:painter.drawLine(QLine(QPoint(X1,Y1),QPoint(X2,Y2)));painter.drawLine(QLine(QPoint(X2,Y2),QPoint(X3,Y3)));painter.drawLine(QLine(QPoint(X1,Y1),QPoint(X3,Y3)));break;case pingyi4:painter.drawLine(QLine(QPoint(X1,Y1),QPoint(X2,Y2)));painter.drawLine(QLine(QPoint(X2,Y2),QPoint(X3,Y3)));painter.drawLine(QLine(QPoint(X1,Y1),QPoint(X3,Y3)));break;case xuanzhuan:painter.drawLine(QLine(QPoint(X1,Y1),QPoint(X2,Y2)));painter.drawLine(QLine(QPoint(X2,Y2),QPoint(X3,Y3)));painter.drawLine(QLine(QPoint(X1,Y1),QPoint(X3,Y3)));break;case fangsuo:painter.drawLine(QLine(QPoint(X1,Y1),QPoint(X2,Y2)));painter.drawLine(QLine(QPoint(X2,Y2),QPoint(X3,Y3)));painter.drawLine(QLine(QPoint(X1,Y1),QPoint(X3,Y3)));break;case duicheng:painter.drawLine(QLine(QPoint(X1,Y1),QPoint(X2,Y2)));painter.drawLine(QLine(QPoint(X2,Y2),QPoint(X3,Y3)));painter.drawLine(QLine(QPoint(X1,Y1),QPoint(X3,Y3)));break;default:break;}}Widget::~Widget()
{delete ui;
}

基本机制就是首先在绘图事件绘制基本的图形框,然后根据不同的图形变换功能func创建相应的枚举值,在connect的槽函数的lambda函数中给func赋值,再通过update函数刷新绘图事件,再在绘图事件函数下,判断func1的值是多少,进而完成相应的功能。

ui界面

ui界面如下,一切从简(为了完成作业

本人代码能力有限,刚学习不久,大佬可能有更好的方法欢迎指正;本文希望可以给和我一样的新人提供帮助。

QT:通过按钮调用qpaintEvent事件实现自定义绘图相关推荐

  1. QT Linux平台屏蔽按键事件(installEventFilter使用) 自定义拦截按键输入

    文章目录 背景 焦点 focus focusPolicy keypress和keyrelease installEventFilter 重写事件过滤器 过滤组件的按键事件 最终效果 Qt是一个跨平台开 ...

  2. 可视化工具Vega的使用,以及如何自定义按钮调用自带的矢量图和位图功能

    1.安装两个依赖:vega和vega-lite 2.使用很简单,请参考 https://juejin.cn/post/6844903945106620424 3.这里详细说一下如何调用Vega自带的下 ...

  3. Qt之QEvent(所有事件的翻译)

    Qt之QEvent(所有事件的翻译) QEvent 类是所有事件类的基类,事件对象包含事件参数. Qt 的主事件循环(QCoreApplication::exec())从事件队列中获取本地窗口系统事件 ...

  4. QT UI控件和事件

    QT UI控件和事件 控件 自定义事件 事件 QEvent 鼠标事件 定时器 绘图事件 文件 控件 登录窗口布局 lable : 标签 (登录的用户名:) Line Edit : 单行的编辑框 (输入 ...

  5. QT 事件系统之QMouseEvent鼠标事件

    概述 在Qt中,鼠标事件被封装成.QMouseEvent对象,QMouseEvent中包含一些参数,用描述鼠标事件. 在QT中,鼠标事件包含:鼠标按键按下,鼠标按键释放,鼠标双击事件,鼠标移动事件. ...

  6. 【Android 插件化】Hook 插件化框架 ( Hook 实现思路 | Hook 按钮点击事件 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  7. 在GridView中添加按钮后,如何触发按钮的各种事件?

    //在GridView中添加按钮后,如何触发按钮的各种事件? 1.在GridView的"编辑列"属性窗口中,增加新的Botton列. 2.然后再该窗口右边属性中,将外观项下的But ...

  8. ios开发返回按钮消失_iOS开发之自定义导航栏返回按钮右滑返回手势失效的解决...

    我相信针对每一个iOS开发者来说~除了根视图控制器外~所有的界面通过导航栏push过去的界面都是可以通过右滑来返回上一个界面~其实~在很多应用和APP中~用户已经习惯了这个功能~然而~作为开发者的我们 ...

  9. Android监听button按钮的click事件

    方式一: 提供所有按钮监听事件入口,在OnClick方法中通过View.getId()获取到发生点击事件的按钮Id,再进行相应的处理, 在页面有多个按钮的情况下比较适用. package com.ex ...

最新文章

  1. Ubuntu创建opencv工程并显示一张图片
  2. 电子病历基本架构与数据标准
  3. QObject::connect: Cannot queue arguments of type xxx的解决方案
  4. 程序员如何在春节假期避免加班?
  5. python list突破上限武器_Python3 tkinter基础 Listbox height 显示行数的上限
  6. 五步法建设你的数据中台
  7. 【J2EE规范】什么是JNDI
  8. 基于JAVA的KTV交易_Java写的KTV管理系统(Swing界面,含源码)
  9. 手机怎么解决同ip多账号_原神手游如何多开刷初始号赚钱技巧攻略 | 兔子IP
  10. AE快速输出GIF动图格式插件:GifGun for Mac(支持ae2022)
  11. Opencv访问图像像素的三种方法
  12. python-QQ群扫码登录(QQ群验证)
  13. 高数 | 函数在间断点处的极值问题
  14. JavaScript 每日一题 #8
  15. 绘制一张透明背景的单色位图
  16. 欧姆龙PLC分频电路
  17. 常用字写法(粤语)--(1)
  18. 谷歌浏览器 翻译无法使用的问题
  19. 01背包问题,多重背包问题-分组背包问题-完全背包问题-总结-内含4种经典背包问题
  20. Android图表控件MPAndroidChart——BarChart实现多列柱状图以及堆积柱状图

热门文章

  1. 自动排产软件中的电子看板
  2. Java之输入输出流(文件的读写)
  3. 全新MyZip for Mac(超快速解压/压缩工具)
  4. PG中的查询:2.统计--(1)
  5. 黑马程序员——Java String类 and 正则表达式(第七篇)
  6. 24日直播预告丨云和恩墨大讲堂:PostgreSQL逻辑复制案例分享
  7. OSGi-best-practice-minibook
  8. 怎么解决IP受限制的问题
  9. C语言例题:输入三个整数x,y,z,请把这三个数由小到大输出。
  10. 2012-02-09 北京爱情故事第四十集(转载)