QT学习第4天:qt点击鼠标画一条直线(附源代码和程序)
时间:2022-07-23
本文章向大家介绍QT学习第4天:qt点击鼠标画一条直线(附源代码和程序),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
创建项目名称:TestMouseEvent 在widget.cpp中添加代码
#include "widget.h"
#include "ui_widget.h"
#include <QEvent>
#include<QMouseEvent>
#include <QDebug>
#include <QPainter>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
int i = 0, j = 0;
int jx1[1000], jy1[1000], jx2[1000], jy2[1000];
int xx1=0, yy1=0, xx2=0, yy2=0;
bool Widget::event(QEvent *ev)
{
if ((ev->type() == QEvent::MouseButtonPress)&&(i%2==0))
{
i++;
QMouseEvent *me1 = static_cast<QMouseEvent*> (ev);
相对坐标
//qDebug() << "MouseButtonPress " << me1->x() << ":" << me1->y();
xx1 = me1->x();
yy1 = me1->y();
return QWidget::event(ev);
}
if ((ev->type() == QEvent::MouseButtonPress) && (i % 2 != 0))
{
i++;
QMouseEvent *me2 = static_cast<QMouseEvent*> (ev);
相对坐标
//qDebug() << "MouseButtonPress " << me2->x() << ":" << me2->y();
xx2 = me2->x();
yy2 = me2->y();
}
if (i == 2)
{
i = 0;
//qDebug() << xx1 << ":" << yy1 << "," << xx2 << ":" << yy2;
}
return QWidget::event(ev);
}
void Widget::paintEvent(QPaintEvent *ev)
{
//设置绘制设备 (widget)
QPainter p(this);
p.begin(this);
//绘制文本
//p.drawText(100, 100, QStringLiteral("测试的显示文字"));
//绘制线
//设置画笔样式
QPen pen;
//实线
pen.setStyle(Qt::SolidLine);
//线粗
pen.setWidth(7);
//线刷子
pen.setBrush(Qt::red);
//结尾端样式
pen.setCapStyle(Qt::RoundCap);
//连接处样式
pen.setJoinStyle(Qt::RoundJoin);
p.setPen(pen);
jx1[j] = xx1;
jy1[j] = yy1;
jx2[j] = xx2;
jy2[j] = yy2;
int temp=0;
for(;temp<j;temp++)
{
p.drawLine(QLine(jx1[temp],jy1[temp], jx2[temp], jy2[temp]));
}
p.end();
j++;
}
在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();
bool event(QEvent *ev);
void paintEvent(QPaintEvent *ev);
private:
Ui::Widget *ui;
};
#endif // WIDGET_H
ui设计(按钮绑定update()更新槽函数,其他颜色设计无影响)
运行结果
- 用SQL解一道有趣的数学题:Gauss和Poincare
- OpenSSL 转换证书格式
- 电子邮件服务器DKIM配置
- 自相矛盾:一个进程可以自成死锁么?
- 数据库安全·开发加密插件
- wordpress无法安装这个包。: PCLZIP_ERR_MISSING_FILE (-4) : Missing archive file 'C:WINDOWSTEMP/wordpress-4.
- 数据库安全·数据加密
- Medium网友开发了一款应用程序 让学习算法和数据结构变得更有趣
- 数据库安全·Token 认证
- 数据库安全·用户/角色认证
- 防止在训练模型时信息丢失 用于TensorFlow、Keras和PyTorch的检查点教程
- 帝国cms如何调用栏目别名作为分类标题?[!--classname--]标签不能用
- 高级软件工程师(面试题)
- 高级软件工程师 2016-9月更新
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 华为开源内部OpenJDK定制版:“毕昇 JDK 8”
- Linux定时任务Crontab命令使用详解与总结
- kotlin实现通知栏提醒功能示例代码
- Linux自动删除n天前日志及实例命令
- Flutter学习教程之Route跳转以及数据传递
- PHP实现限制域名访问的实现代码(本地验证)
- 吸引发烧友的视听Linux发行版
- Linux下完全删除用户的两种方法
- flutter实现轮播图效果
- Ubuntu 16.04设置PostgreSQL开机启动的方法
- 使用userdel命令删除Linux用户的教程详解
- Linux系统交换空间介绍
- 小内存服务器上宝塔默认安装的MySQL如何优化配置
- (译)SDL编程入门(15)旋转和翻转
- linux解决ping通但端口不通的问题