2023/9/19 -- C++/QT

作业

1> 登录框实现注册功能,将注册的结果放入文件中(君子作业)

2> 完成文本编辑器的保存工作

void Widget::on_saveBtn_clicked()
{QString fileName = QFileDialog::getSaveFileName(this,"另存为","./","*.txt");if(fileName.isNull()){QMessageBox::information(this,"提示","用户取消了另存文件");return;}QFile file(fileName);if(!file.isOpen()){if(!file.open(QIODevice::WriteOnly)){QMessageBox::critical(this,"错误","打开失败");return;}}QString text = ui->textEdit->toPlainText();file.write(text.toUtf8());file.close();
}

3>

 widget.h:

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QDebug>
#include <QTimer>
#include <QTime>
#include <QTextToSpeech>
#include <QMessageBox>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTvoid timerEvent(QTimerEvent *e)override;public:Widget(QWidget *parent = nullptr);~Widget();private slots:void on_startBtn_clicked();void on_stopBtn_clicked();private:Ui::Widget *ui;int time_id1;int time_id2;QTextToSpeech *speecher;
};
#endif // WIDGET_H

 widget.cpp:

#include "widget.h"
#include "ui_widget.h"void Widget::timerEvent(QTimerEvent *e)
{if(e->timerId() == time_id1){QTime sys_t = QTime::currentTime();          //获取系统时间//将QTime类对象转换为字符串QString t = sys_t.toString("hh:mm:ss");//展示到ui界面ui->timeLabel->setText(t);}if(e->timerId() == time_id2){QTime sys_t = QTime::currentTime();          //获取系统时间//将QTime类对象转换为字符串QString t = sys_t.toString("hh:mm:ss");if(t == ui->timeEdit->text()){QString text = ui->textEdit->toPlainText();speecher->say(text.toUtf8());}}
}Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);time_id1 = startTimer(1000);ui->timeLabel->setAlignment(Qt::AlignCenter);ui->timeEdit->setAlignment(Qt::AlignCenter);speecher = new QTextToSpeech(this);
}Widget::~Widget()
{delete ui;
}//启动按钮
void Widget::on_startBtn_clicked()
{time_id2 = startTimer(1000);//提示信息QMessageBox box(QMessageBox::Information,"提示","已启动",QMessageBox::Ok,this);box.exec();
}//停止按钮
void Widget::on_stopBtn_clicked()
{killTimer(time_id2);//提示信息QMessageBox box(QMessageBox::Information,"提示","已停止",QMessageBox::Ok,this);box.exec();
}

效果图:

一、事件处理机制

1.1 事件处理简介

1. 什么是事件?  (重点)事件是由窗口系统或者自身产生的,用以响应所发生的
各类事情,比如用户按下并释放了键盘或者鼠标、窗口因
暴露而需要重绘、定时器到时而应有所动作,等等从某种意义上讲,事件比信号更原始,甚至可以认为大多
数信号其实都是由事件产生的。比如一个下压式按钮首先
感受到的是鼠标事件,在进行必要的处理以产生按钮下沉
继而弹起的视觉效果之后,才会发射 clicked()信号2. 如何处理事件?  (重点)myWnd(自定义类) -继承-> QWidget -继承-> QObject    1> 当事件发生时,首先被调用的是QObject类中的虚函数event(),其 QEvent型参数标识了具体的事件类型bool QObject:: event (QEvent* e){if (e == mouseEvent){void QWidget::mousePressEvent (QMouseEvent* e)void QWidget:: mouseReleaseEvent (QMouseEvent* e)}if(e == keyEvent){void QWidget::keyPressEvent (QMouseEvent* e)void QWidget:: keyReleaseEvent (QMouseEvent* e)}}2> 作为QObject类的子类, QWidget类覆盖了其基类中的event()虚函数,并根据具体事件调用具体事件处理函数void QWidget::mousePressEvent (QMouseEvent* e)void QWidget::mouseReleaseEvent (QMouseEvent* e)void QWidget::keyPressEvent (QMouseEvent* e)void QWidget:: keyReleaseEvent (QMouseEvent* e)void QWidget::paintEvent (QPaintEvent* e):3> 而这些事件处理函数同样也是虚函数,也可以被 QWidget类的子类覆盖,以提供针对不同窗口部件类型的事件处理4> 组件的使用者所关心的往往是定义什么样的槽处理什么样的信号,而组件的实现者更关心覆盖哪些事件处理函数

1.2 事件处理函数由来

QObject类 提供了那些可以重写的虚函数[virtual] bool QObject::event(QEvent *e) // 参数:事件的类型QWidgets类, 提供了那些可以重写的虚函数[override virtual protected] bool QWidget::event(QEvent *event)[virtual protected] void QWidget::keyPressEvent(QKeyEvent *event)[virtual protected] void QWidget::keyReleaseEvent(QKeyEvent *event)[virtual protected] void QWidget::mouseMoveEvent(QMouseEvent *event)[virtual protected] void QWidget::mousePressEvent(QMouseEvent *event)[virtual protected] void QWidget::mouseReleaseEvent(QMouseEvent *event)[virtual protected] void QWidget::mouseDoubleClickEvent(QMouseEvent *event)[virtual protected] void QObject::timerEvent(QTimerEvent *event)QPainter类 ---> 画家类void SimpleExampleWidget::paintEvent(QPaintEvent *){QPainter painter(this);painter.setPen(Qt::blue);painter.setFont(QFont("Arial", 30));painter.drawText(rect(), Qt::AlignCenter, "Qt");}

1.3 鼠标和键盘事件

1> 事件处理函数

 //重写自己的键盘事件处理函数void keyPressEvent(QKeyEvent *event) override;           //键盘按下事件处理函数void keyReleaseEvent(QKeyEvent *event) override;         //键盘抬起事件处理函数//重写自己的鼠标事件处理函数void mousePressEvent(QMouseEvent *event) override;           //鼠标按下事件处理函数void mouseReleaseEvent(QMouseEvent *event) override;         //鼠标抬起事件处理函数void mouseDoubleClickEvent(QMouseEvent *event) override;      //鼠标双击事件处理函数void mouseMoveEvent(QMouseEvent *event) override;             //鼠标移动事件处理函数

2> 案例

1、ui界面

2> 头文件

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QKeyEvent>            //键盘事件处理类
#include<QDebug>                //信息调试类
#include<QMouseEvent>           //鼠标事件处理类QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();//重写自己的键盘事件处理函数void keyPressEvent(QKeyEvent *event) override;           //键盘按下事件处理函数void keyReleaseEvent(QKeyEvent *event) override;         //键盘抬起事件处理函数//重写自己的鼠标事件处理函数void mousePressEvent(QMouseEvent *event) override;           //鼠标按下事件处理函数void mouseReleaseEvent(QMouseEvent *event) override;         //鼠标抬起事件处理函数void mouseDoubleClickEvent(QMouseEvent *event) override;      //鼠标双击事件处理函数void mouseMoveEvent(QMouseEvent *event) override;             //鼠标移动事件处理函数private:Ui::Widget *ui;
};
#endif // WIDGET_H

3> 源文件

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//开启鼠标追踪功能this->setMouseTracking(true);
}Widget::~Widget()
{delete ui;
}//键盘按下事件处理函数的实现
void Widget::keyPressEvent(QKeyEvent *event)
{qDebug()<<"有键盘被按下了,键值为"<<event->key()<<"   text:"<<event->text();//可以对事件的键值进行判断switch(event->key()){case 'W':{if(ui->label->y() <= 0-ui->label->height())         //说明该组件已经全部脱离界面{ui->label->move(ui->label->x(), this->height());      //将组件放到最下面}ui->label->move(ui->label->x(), ui->label->y()-1);}break;}}//键盘抬起事件处理函数的实现
void Widget::keyReleaseEvent(QKeyEvent *event)
{qDebug()<<"有键盘被抬起了";
}//鼠标按下事件处理函数的定义
void Widget::mousePressEvent(QMouseEvent *event)
{//判断是哪个鼠标被按下if(event->button() == Qt::LeftButton){qDebug()<<"鼠标左键被按下,全局坐标点:"<<event->globalPos()<<"   组件内坐标:"<<event->pos();}else if(event->button() == Qt::RightButton){qDebug()<<"鼠标右键被按下,全局坐标点:"<<event->globalPos()<<"   组件内坐标:"<<event->pos();}else if(event->button() == Qt::MidButton){qDebug()<<"鼠标中间键被按下,全局坐标点:"<<event->globalPos()<<"   组件内坐标:"<<event->pos();}else{qDebug()<<"鼠标其他键被按下,全局坐标点:"<<event->globalPos()<<"   组件内坐标:"<<event->pos();}
}
//鼠标抬起事件处理函数的定义
void Widget::mouseReleaseEvent(QMouseEvent *event)
{//判断是哪个鼠标被抬起if(event->button() == Qt::LeftButton){qDebug()<<"鼠标左键被抬起,全局坐标点:"<<event->globalPos()<<"   组件内坐标:"<<event->pos();}else if(event->button() == Qt::RightButton){qDebug()<<"鼠标右键被抬起,全局坐标点:"<<event->globalPos()<<"   组件内坐标:"<<event->pos();}else if(event->button() == Qt::MidButton){qDebug()<<"鼠标中间键被抬起,全局坐标点:"<<event->globalPos()<<"   组件内坐标:"<<event->pos();}else{qDebug()<<"鼠标其他键被抬起,全局坐标点:"<<event->globalPos()<<"   组件内坐标:"<<event->pos();}
}
//鼠标双击事件处理函数的定义
void Widget::mouseDoubleClickEvent(QMouseEvent *event)
{//判断是哪个鼠标被双击if(event->button() == Qt::LeftButton){qDebug()<<"鼠标左键被双击,全局坐标点:"<<event->globalPos()<<"   组件内坐标:"<<event->pos();}else if(event->button() == Qt::RightButton){qDebug()<<"鼠标右键被双击,全局坐标点:"<<event->globalPos()<<"   组件内坐标:"<<event->pos();}else if(event->button() == Qt::MidButton){qDebug()<<"鼠标中间键被双击,全局坐标点:"<<event->globalPos()<<"   组件内坐标:"<<event->pos();}else{qDebug()<<"鼠标其他键被双击,全局坐标点:"<<event->globalPos()<<"   组件内坐标:"<<event->pos();}
}
//鼠标移动事件处理函数的定义
void Widget::mouseMoveEvent(QMouseEvent *event)
{//判断是哪个鼠标被移动qDebug()<<"鼠标全局位置:"<<event->globalPos()<<"    组件内位置:"<<event->pos();ui->label->move(event->pos());          //将组件跟随鼠标移动if(event->buttons() == Qt::LeftButton){qDebug()<<"鼠标左键被移动,全局坐标点:"<<event->globalPos()<<"   组件内坐标:"<<event->pos();}else if(event->buttons() == Qt::RightButton){qDebug()<<"鼠标右键被移动,全局坐标点:"<<event->globalPos()<<"   组件内坐标:"<<event->pos();}else if(event->buttons() == Qt::MidButton){qDebug()<<"鼠标中间键被移动,全局坐标点:"<<event->globalPos()<<"   组件内坐标:"<<event->pos();}else{qDebug()<<"鼠标其他键被移动,全局坐标点:"<<event->globalPos()<<"   组件内坐标:"<<event->pos();}
}

1.4 鼠标事件案例

1> 头文件

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QDebug>
#include<QMouseEvent>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();//重写鼠标事件处理函数void mouseMoveEvent(QMouseEvent *event) override;void mousePressEvent(QMouseEvent *event) override;private:Ui::Widget *ui;QPoint p;              //记录鼠标相对于组件的位置
};
#endif // WIDGET_H

2> 源文件

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);//设置纯净窗口this->setWindowFlag(Qt::FramelessWindowHint);
}Widget::~Widget()
{delete ui;
}//鼠标移动事件处理函数
void Widget::mouseMoveEvent(QMouseEvent *event)
{this->move( event->globalPos() - p );
}//鼠标按下事件处理函数
void Widget::mousePressEvent(QMouseEvent *event)
{if(event->button() == Qt::LeftButton){p = event->globalPos() - this->pos();//      鼠标的全局坐标        组件的全局坐标//qDebug()<<this->pos()<<endl;}else if(event->button() == Qt::RightButton){this->close();}
}

1.5 定时器

1> 所谓定时器,就是当定时器启动后,系统会每隔给定的时间自动调用某些函数

2> 定时器的实现有两个版本:基于属性版本和事件处理版本

3> 基于事件处理函数版本

1、无需实例化对象,调用的函数都是自身提供的
2、调用自身的成员函数startTimer(sec),启动一个定时器,那么系统就会每隔sec毫秒,自动调用自身的定时器事件处理函数,该函数返回创建的定时器id
3、调用自身成员函数killTimer(id)
4、重写定时器事件处理函数:void timerEvent(QTimerEvent *event);

案例

1、ui界面

2、头文件

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QTimerEvent>             //定时器事件处理类
#include<QTime>QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent = nullptr);~Widget();void timerEvent(QTimerEvent *e) override;         //定时器事件处理函数private slots:void on_startBtn_clicked();void on_closeBtn_clicked();private:Ui::Widget *ui;int timer_id;             //定时器的id号};
#endif // WIDGET_H

3、源文件

#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::on_startBtn_clicked()
{timer_id = this->startTimer(1000);//功能:启动一个定时器//参数:超时时间,每隔给定的时间后,自动调用定时器事件处理函数//返回值:当前定时器的id号}//关闭定时器按钮对应的槽函数
void Widget::on_closeBtn_clicked()
{this->killTimer(timer_id);           //关闭给定的定时器
}//定时器事件处理函数
void Widget::timerEvent(QTimerEvent *e)
{if(e->timerId() == timer_id)         //说明定时器1到位{QTime sys_t = QTime::currentTime();          //获取系统时间//将QTime类对象转换为字符串QString t = sys_t.toString("hh:mm:ss");//展示到ui界面ui->timeLab->setText(t);}//    if(e->timerId() == timer_id_1)         //说明定时器1到位
//    {//    }
}

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

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

相关文章

036:vue导出页面生成pdf文件

第036个 查看专栏目录: VUE ------ element UI 专栏目标 在vue和element UI联合技术栈的操控下&#xff0c;本专栏提供行之有效的源代码示例和信息点介绍&#xff0c;做到灵活运用。 &#xff08;1&#xff09;提供vue2的一些基本操作&#xff1a;安装、引用&#xff0c;模板使…

元数据管理平台Datahub0.10.5版本安装部署与导入各种元数据手册

官网文档连接 DataHub Quickstart Guide | DataHub (datahubproject.io) 本文所选择的Python的版本为3.8.16&#xff0c;Docker版本为20.10.0&#xff0c;Datahub为0.10.5版本 python必须为3.7以上的版本。0.10.5不支持以下的版本 如果要使用web上的 添加数据源 直接调用的…

中国提出FastSAM:在RTX3090上提升了ViT-H E(32×32) 50倍速度

文章目录 1. Abstract2. 背景介绍3. 框架详情 (Methodology)3.1 Overview3.2 All-instance Segmentation3.3 Prompt-guided Selection4. Experiments4.1 Run-time Efficiency Evaluation4.2 Zero-Shot Edge Detection4.2.1 BSDS5004.2.2 Sobel filtering4.2.3 NMS4.3 Zero-Shot…

Redis 列表操作实战(全)

目录 LINDEX 获取指定下标元素 LSET 指定下标添加元素 LPUSH 将元素插入列表头 LPUSHX RPUSH 将元素插入列表尾 RPUSHX LINSERT 将元素插入列表某位置之前 LLEN 列表长度 LPOP 取列表头元素 RPOP 取列表尾元素 BLPOP 阻塞式取列表头元素 BRPOP 阻塞式取列表尾元素…

视频监控系统/视频汇聚平台EasyCVR平台页面展示优化

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

企望制造ERP存在远程命令执行漏洞 附POC

文章目录 企望制造ERP存在远程命令执行漏洞 附POC1. 企望制造ERP简介2.漏洞描述3.影响版本4.fofa查询语句5.漏洞复现6.POC&EXP7.整改意见8.往期回顾 企望制造ERP存在远程命令执行漏洞 附POC 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播…

C# OpenCvSharp 图片模糊检测(拉普拉斯算子)

效果 项目 代码 using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Windows.Forms.VisualStyl…

python+django学习资料在线分享系统vue

本站是一个B/S模式系统&#xff0c;采用vue框架作为开发技术&#xff0c;MYSQL数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得校园资料分享平台管理工作系统化、规范化。技术栈 后端&#xff1a;pyth…

零基础学前端(四)1. 重点讲解 CSS:盒子模型、样式选择器

1. 该篇适用于从零基础学习前端的小白 2. 初学者不懂代码得含义也要坚持模仿逐行敲代码&#xff0c;以身体感悟带动头脑去理解新知识 3. 初学者切忌&#xff0c;不要眼花缭乱&#xff0c;不要四处找其它文档&#xff0c;要坚定一个教授者的方式&#xff0c;将其学通透&#xff…

RK3568平台开发系列讲解(驱动篇)RK3568 I2C总线介绍

🚀返回专栏总目录 文章目录 一、I2C 简介1.1、起始位1.2、停止位1.3、数据传输1.4、应答信号1.5、I2C 写时序1.6、I2C 读时序1.7、I2C 多字节读写时序二、RK3568 I2C 总线介绍沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇我们将讲解RK3568 I2C总线特性。 一、…

使用 K 均值聚类进行颜色分割

介绍 颜色分割是计算机视觉中使用的一种技术,用于根据颜色识别和区分图像中的不同对象或区域。聚类算法可以自动将相似的颜色分组在一起,而不需要为每种颜色指定阈值。当处理具有大范围颜色的图像时,或者当事先不知道确切的阈值时,这非常有用。 在本教程中,我们将探讨如何…

Zipping

Zipping 信息收集端口扫描目录扫描webbanner信息收集 漏洞利用空字节绕过---->失败sqlI-preg_match bypass反弹shell 稳定维持 提权-共享库漏洞 参考&#xff1a;https://rouvin.gitbook.io/ibreakstuff/writeups/htb-season-2/zipping#sudo-privileges-greater-than-stock-…

【ComfyUI】RuntimeError: CUDA error: operation not supported

文章目录 前言解决办法方式一&#xff1a;黑名单策略方式二&#xff1a;启动时添加--disable-cuda-malloc 前言 最近好不容易&#xff0c;安装好ComfyUI后&#xff0c;启动也OK&#xff0c;点击生成图片时&#xff0c;报错了 got prompt model_type EPS adm 0 making attenti…

Postman应用——Collection、Folder和Request

文章目录 Collection新建CollectionCollection重命名保存Request到Collection在Collection下创建Request删除Collection Folder新建FolderFolder重命名保存Request到Folder在Folder下创建Request在Folder下创建Folder删除Folder Request创建临时RequestRequest重命名删除Reques…

【AAAI2023】Spatial-Spectral Transformer for Hyperspectral Image Denoising

论文&#xff1a;https://readpaper.com/paper/4694783227240398849 代码&#xff1a;https://github.com/MyuLi/SST 1、总体介绍 高光谱图像&#xff08;HSI&#xff09;去噪是后续HSI应用的关键预处理过程&#xff0c;但是基于CNN的方法需要在计算效率与非局部特征建模能力之…

如何快速走出网站沙盒期(关于优化百度SEO提升排名)

网站沙盒期是指新建立的网站在百度搜索引擎中无法获得好的排名&#xff0c;甚至被完全忽略的现象。这个现象往往发生在新建立的网站上&#xff0c;因为百度需要时间来评估网站的质量和内容。蘑菇号www.mooogu.cn 为了快速走出网站沙盒期&#xff0c;需要优化百度SEO。以下是5个…

【Linux】【网络】应用层协议:HTTPS

文章目录 HTTPS1. 加密方式2. 数据摘要 \ 数据指纹3. 数字签名 HTTPS 的 工作过程HTTPS 工作过程中的密钥 HTTP HTTPS HTTP&#xff08;HyperText Transfer Protocol&#xff09;&#xff1a; 是客户端浏览器或其他程序与 Web 服务器之间的应用层通信协议。 HTTPS&#xff0…

Mysql002:(库和表)操作SQL语句

目录&#xff1a; 》SQL通用规则说明 SQL分类&#xff1a; 》DDL&#xff08;数据定义&#xff1a;用于操作数据库、表、字段&#xff09; 》DML&#xff08;数据编辑&#xff1a;用于对表中的数据进行增删改&#xff09; 》DQL&#xff08;数据查询&#xff1a;用于对表中的数…

FFMpeg zoompan 镜头聚焦和移动走位

案例 原始图片 # 输出帧数&#xff0c;默认25帧/秒&#xff0c;25*4 代表4秒 # s1280x80 # 输出视频比例&#xff0c;可以设置和输入图片大小一致 # zoom0.002 表示每帧放大的倍数&#xff0c;下面代码是25帧/每秒 * 4秒&#xff0c;共1000帧 # 最终是 0.002*25*4 0.2&…

Cesium 生成点位坐标

文章目录 需求分析1. 点击坐标点实现2. 输入坐标实现 需求 用 Cesium 生成点位坐标&#xff0c;并明显标识 分析 以下是我的两种实现方式 第一种是坐标点击实现 第二种是输入坐标实现 1. 点击坐标点实现 //点位坐标getLocation() {this.hoverIndex 0;let that this;this.view…