当前位置: 首页 > news >正文

Qt 学习第十六天:文件和事件

一、创建widget对象(文件)

二、设计ui界面

放一个label标签上去,设置成box就可以显示边框了

三、新建Mylabel类

四、提升ui界面的label标签为Mylabel

五、修改mylabel.h,mylabel.cpp

#ifndef MYLABEL_H
#define MYLABEL_H#include <QLabel>class Mylabel : public QLabel
{Q_OBJECT
public:explicit Mylabel(QWidget *parent = nullptr);signals:};#endif // MYLABEL_H
#include "mylabel.h"Mylabel::Mylabel(QWidget *parent): QLabel{parent}
{}

六、实现鼠标进入事件,鼠标移动事件

// 鼠标进入事件函数
void Mylabel::enterEvent(QEnterEvent *e){qDebug() << "鼠标进入标签!";}// 鼠标移动事件
void Mylabel::mousePressEvent(QMouseEvent *e){if(e->button() == Qt::LeftButton){QString s = QString("鼠标左键按下了! x = %1, y = %2").arg(e->x()).arg(e->y());qDebug() << s.toUtf8().data() ; //去掉双引号}if(e->button() == Qt::RightButton){QString s = QString("鼠标右键按下了! x = %1, y = %2").arg(e->x()).arg(e->y());qDebug() << s.toUtf8().data() ; //去掉双引号}
}

七、widget中实现键盘按下按键事件

//键盘按下按键
void Widget::keyPressEvent(QKeyEvent *e){if(e->key() == Qt::Key_Any){qDebug() << "键盘空格键被按下!" ;}if(e->key() == Qt::Key_Enter){qDebug() << "键盘回车键被按下!" ;}
}

八、widget中实现事件分发器和事件过滤器

//事件分发器
bool Widget::event(QEvent *e){if(e->type() == QEvent::MouseButtonPress){qDebug() << "鼠标在窗口被按下!";return true; //返回true,代表不向下分发}//其他事件交给父类处理return QWidget::event(e);
}//事件过滤器
bool Widget::eventFilter(QObject *obj, QEvent *e){if(obj == ui->label) //判断控件{if(e->type() == QEvent::MouseButtonPress){QMouseEvent *me = static_cast<QMouseEvent *>(e);QString str = QString("事件过滤器中鼠标按下:x = %1, y = %2").arg(me->x()).arg(me->y());qDebug() << str.toUtf8().data();return true;}}//其他的交给父类处理return QWidget::eventFilter(obj, e);
}

完整代码

mylabel.h

#ifndef MYLABEL_H
#define MYLABEL_H#include <QLabel>
#include <QEvent>
#include <QMouseEvent>class Mylabel : public QLabel
{Q_OBJECT
public:explicit Mylabel(QWidget *parent = nullptr);// 鼠标进入事件函数void enterEvent(QEnterEvent *e);// 鼠标移动事件void mousePressEvent(QMouseEvent* e);signals:};#endif // MYLABEL_H

widget.h

#ifndef WIDGET_H
#define 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 keyPressEvent(QKeyEvent *e);//事件分发器bool event(QEvent *e);//事件过滤器bool eventFilter(QObject *odj, QEvent *e);private:Ui::Widget *ui;
};
#endif // WIDGET_H

mylabel.cpp

#include "mylabel.h"
#include <QDebug>Mylabel::Mylabel(QWidget *parent): QLabel{parent}
{}// 鼠标进入事件函数
void Mylabel::enterEvent(QEnterEvent *e){qDebug() << "鼠标进入标签!";}// 鼠标移动事件
void Mylabel::mousePressEvent(QMouseEvent *e){if(e->button() == Qt::LeftButton){QString s = QString("鼠标左键按下了! x = %1, y = %2").arg(e->x()).arg(e->y());qDebug() << s.toUtf8().data() ; //去掉双引号}if(e->button() == Qt::RightButton){QString s = QString("鼠标右键按下了! x = %1, y = %2").arg(e->x()).arg(e->y());qDebug() << s.toUtf8().data() ; //去掉双引号}
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);
}Widget::~Widget()
{delete ui;
}//键盘按下按键
void Widget::keyPressEvent(QKeyEvent *e){if(e->key() == Qt::Key_Any){qDebug() << "键盘空格键被按下!" ;}if(e->key() == Qt::Key_Enter){qDebug() << "键盘回车键被按下!" ;}
}//事件分发器
bool Widget::event(QEvent *e){if(e->type() == QEvent::MouseButtonPress){qDebug() << "鼠标在窗口被按下!";return true; //返回true,代表不向下分发}//其他事件交给父类处理return QWidget::event(e);
}//事件过滤器
bool Widget::eventFilter(QObject *obj, QEvent *e){if(obj == ui->label) //判断控件{if(e->type() == QEvent::MouseButtonPress){QMouseEvent *me = static_cast<QMouseEvent *>(e);QString str = QString("事件过滤器中鼠标按下:x = %1, y = %2").arg(me->x()).arg(me->y());qDebug() << str.toUtf8().data();return true;}}//其他的交给父类处理return QWidget::eventFilter(obj, e);
}

【运行结果】 

---------------------------------------------------------------------------------------------------------------------------------

一、创建mainwindow对象(事件)

二、设计ui界面

点一下水平布局即可填充全部

三、实现菜单栏

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QFile>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QAction *action1 = new QAction("打开");QAction *action2 = new QAction("保存");ui->menu->addAction(action1);ui->menu->addAction(action2);connect(action1, &QAction::triggered, this, &MainWindow::openFile);connect(action2, &QAction::triggered, this, &MainWindow::saveFile);
}

四、实现打开文件操作

void MainWindow::openFile(){//1. 先弹出 "打开文件" 对话框. 让用户选择打开哪个文件.QString path = QFileDialog::getOpenFileName(this);//2. 把文件名显示到状态栏里.QStatusBar *stbar = this->statusBar();stbar->showMessage(path);//3. 根据用户选择的路径, 构造一个 QFile 对象. 并打开文件QFile file(path);bool isOpen = file.open(QFile::ReadOnly);if(!isOpen){//打开文件失败!stbar->showMessage(path + "打开失败");return;}//4. 读取文件QString text = file.readAll();//读到的内容设置到输入框中.ui->plainTextEdit->setPlainText(text);//6. 关闭文件!! 千万不要忘记!!file.close();}

五、实现保存文件操作

记得要开一个新的记事本,血的教训,错了不能反悔的

void MainWindow::saveFile(){//1. 先弹出 "保存文件" 对话框.QString path = QFileDialog::getOpenFileName(this);//2. 把文件名显示到状态栏里.QStatusBar *stbar = this->statusBar();stbar->showMessage(path);//3. 根据用户选择的路径, 构造一个 QFile 对象. 并打开文件QFile file(path);bool isOpen = file.open(QFile::WriteOnly);if(!isOpen){//打开文件失败!stbar->showMessage(path + "打开失败");return;}//4. 写文件const QString &text = ui->plainTextEdit->toPlainText();file.write(text.toUtf8());//5. 关闭文件.file.close();
}

完整代码

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();void openFile();void saveFile();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QFileDialog>
#include <QFile>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);QAction *action1 = new QAction("打开");QAction *action2 = new QAction("保存");ui->menu->addAction(action1);ui->menu->addAction(action2);connect(action1, &QAction::triggered, this, &MainWindow::openFile);connect(action2, &QAction::triggered, this, &MainWindow::saveFile);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::openFile(){//1. 先弹出 "打开文件" 对话框. 让用户选择打开哪个文件.QString path = QFileDialog::getOpenFileName(this);//2. 把文件名显示到状态栏里.QStatusBar *stbar = this->statusBar();stbar->showMessage(path);//3. 根据用户选择的路径, 构造一个 QFile 对象. 并打开文件QFile file(path);bool isOpen = file.open(QFile::ReadOnly);if(!isOpen){//打开文件失败!stbar->showMessage(path + "打开失败");return;}//4. 读取文件QString text = file.readAll();//读到的内容设置到输入框中.ui->plainTextEdit->setPlainText(text);//6. 关闭文件!! 千万不要忘记!!file.close();}void MainWindow::saveFile(){//1. 先弹出 "保存文件" 对话框.QString path = QFileDialog::getOpenFileName(this);//2. 把文件名显示到状态栏里.QStatusBar *stbar = this->statusBar();stbar->showMessage(path);//3. 根据用户选择的路径, 构造一个 QFile 对象. 并打开文件QFile file(path);bool isOpen = file.open(QFile::WriteOnly);if(!isOpen){//打开文件失败!stbar->showMessage(path + "打开失败");return;}//4. 写文件const QString &text = ui->plainTextEdit->toPlainText();file.write(text.toUtf8());//5. 关闭文件.file.close();
}

【运行结果】

相关文章:

Qt 学习第十六天:文件和事件

一、创建widget对象&#xff08;文件&#xff09; 二、设计ui界面 放一个label标签上去&#xff0c;设置成box就可以显示边框了 三、新建Mylabel类 四、提升ui界面的label标签为Mylabel 五、修改mylabel.h&#xff0c;mylabel.cpp #ifndef MYLABEL_H #define MYLABEL_H#incl…...

nvm 切换 Node.js 版本

nvm 切换 Node.js 版本 0. nvm 安装1. 查看装了哪些 Node.js 版本2. 安装 Node.js 版本安装最新稳定版本.安装个18 3. 切换 Node.js 版本4. 设置默认 Node.js 版本5. 卸载 Node.js 版本6.与项目的配合使用参考资料 0. nvm 安装 安装教程就不写了&#xff0c;直接看别人的。 脚…...

AI绘图最强软件stable diffusion,一文带你迅速了解!

有需要stable diffusion整合包可以扫描下方&#xff0c;免费获取 01 — 什么是 SD ​ Stable Difusion(简称 SD) 其三种概念。 1.用来指代稳定扩散(Stable Diffusion) 技术,如 Midjourney是基于Stable Difusion技术实现的就是指它运用了 Stable Diffusion 的技术原理。 …...

VMware重磅官宣!Workstation和Fusion彻底全部免费:支持商用

VMware 官网宣布&#xff1a;VMware Workstation Pro: Now Available Free for Personal Use 别问&#xff0c;问就是正版用户&#xff01;&#xff01;&#xff01; VMware宣布&#xff0c;其桌面虚拟化产品VMware Workstation和VMware Fusion将对所有用户彻底免费&#xff0…...

CCS 学习记录

1.导入项目 在CCS菜单中选择Project->Import Existing CCS Eclipse Project&#xff0c;点击Browse找到CCS workspace所在文件夹&#xff0c;点击OK&#xff0c;CCS会自动将所选文件夹及其子文件夹下所有的CCS Projects列出。从列表中找到所要导入的项目文件夹&#xff0c;…...

241112.学习日志——[CSDIY] Cpp零基础速成 [01]

CSDIY&#xff1a;这是一个非科班学生的努力之路&#xff0c;从今天开始这个系列会长期更新&#xff0c;&#xff08;最好做到日更&#xff09;&#xff0c;我会慢慢把自己目前对CS的努力逐一上传&#xff0c;帮助那些和我一样有着梦想的玩家取得胜利&#xff01;&#xff01;&…...

94.【C语言】数据结构之双向链表的初始化,尾插,打印和尾删

目录 1.双向链表 2.结构体的定义 3.示意图 3.代码示例 1.双向链表的尾插 示意图 代码 main.c List.h List.c 详细分析代码的执行过程 双向链表的初始化 2.双向链表的打印 代码 3.双向链表的尾删 1.双向链表 以一种典型的双向链表为例:带头双向循环链表(带头:带…...

learn-F12 Performance(性能)前端性能分析(LCP,CLS,INP)

1.前言 在浏览器开发者工具&#xff08;F12&#xff09;中&#xff0c;本地指标&#xff08;Local Metrics&#xff09;包括LCP&#xff08; Largest Contentful Paint&#xff09;、CLS&#xff08; Cumulative Layout Shift&#xff09;和INP&#xff08; Interaction to Nex…...

XCZU47DR-2FSVE1156

XCZU47DR-2FSVE1156 芯片概述 XCZU47DR-2FSVE1156 是一款由 Xilinx 公司生产的 Zynq UltraScale™ RFSoC 芯片。该芯片集成了多种高性能组件&#xff0c;包括四核 ARM Cortex-A53 MPCore™ 和双核 ARM Cortex™-R5&#xff0c;提供了强大的计算能力和灵活性。它还具备丰富的连…...

物联网低功耗广域网LoRa开发(一):LoRa物联网行业解决方案

一、LoRa的优势以及与其他无线通信技术对比 &#xff08;一&#xff09;LoRa的优势 1、164dB链路预算 、距离>15km 2、快速、灵活的基础设施易组网且投资成本较少 3、LoRa节点模块仅用于通讯电池寿命长达10年 4、免牌照的频段 网关/路由器建设和运营 、节点/终端成本低…...

【LeetCode】【算法】23. 合并K个升序链表

LeetCode 23. 合并K个升序链表 题目描述 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 思路 思路&#xff1a;用小根堆解&#xff0c;很强 创建一个小根堆&#xff0c;排序规则为小根堆排序…...

python3的基本数据类型:Dictionary(字典)的创建

一. 简介 本文开始简单学习一下 python3中的一种基本数据类型&#xff1a;Dictionary&#xff08;字典&#xff09;。 字典&#xff08;dictionary&#xff09;是Python中另一个非常有用的内置数据类型。 二. python3的基本数据类型&#xff1a;Dictionary&#xff08;字典&…...

【C++】string模拟实现

各位读者老爷好&#xff0c;俺最近在学习string的一些知识。为了更好的了解string的结构&#xff0c;俺模拟实现了一个丐版string&#xff0c;有兴趣的老爷不妨垂阅&#xff01;&#xff01;&#xff01; 目录 1.string类的定义 2.模拟实现成员函数接口 2.1.constructor&am…...

Springboot 使用EasyExcel导出含图片并设置样式的Excel文件

Springboot 使用EasyExcel导出含图片并设置样式的Excel文件 Excel导出系列目录&#xff1a;★★★★尤其注意&#xff1a;引入依赖创建导出模板类逻辑处理controllerservice 导出效果总结 Excel导出系列目录&#xff1a; 【Springboot 使用EasyExcel导出Excel文件】 【Springb…...

技术分享:《越南语翻译通》App高效学习越南语的智能助手,是怎么实现高精度语音识别翻译功能的呢?

在数字化时代&#xff0c;语言学习和跨文化交流变得日益重要。对于那些计划前往越南工作、旅游或学习的人来说&#xff0c;掌握越南语无疑是一个巨大的优势。然而&#xff0c;对于非越南语母语者来说&#xff0c;语言障碍可能会成为一大难题。幸运的是&#xff0c;《越南语翻译…...

工业互联网实验实训解决方案核心优势

工业互联网实验实训解决方案旨在通过模拟真实的工业环境&#xff0c;提供给学生或从业人员一个实践学习的平台&#xff0c;它结合了理论教学与实际操作&#xff0c;旨在培养具备工业互联网相关技能的专业人才。 工业互联网实验室必备的软件工具包括&#xff1a; 仿…...

Ceph client 写入osd 数据的两种方式librbd 和kernel rbd

在Ceph存储系统中&#xff0c;客户端&#xff08;Ceph client&#xff09;写入OSD&#xff08;Object Storage Daemon&#xff09;数据确实可以通过两种主要方式&#xff1a;librbd和kernel rbd。这两种方式各有特点和适用场景&#xff0c;下面将分别进行详细介绍。 librbd方式…...

相机光学(四十二)——sony的HDR技术

1.概述 索尼的HDR技术包括以下几种,这些技术共同构成了索尼在HDR领域的技术矩阵&#xff0c;旨在提供更宽广的动态范围、更丰富的色彩表现以及更真实的光影效果: Multi-frame HDR&#xff08;多帧异曝光HDR&#xff09;&#xff1a;这是一种通过不同曝光时间图像的多帧合成来实…...

文件上传漏洞--理论

什么是文件上传漏洞&#xff1f; Web应用允许用户上传文件&#xff0c;但是没有对上传的文件进行严格的过滤和检测&#xff0c;导致网站执行了文件中包含的恶意代码。 漏洞的基本利用方式是&#xff1a; 成功上传包含恶意代码的文件&#xff0c;并在服务端成功执行该文件。 …...

快速入门Selenium自动化测试

一、背景与意义 Selenium是常用的Web自动化测试工具&#xff0c;前端开发工程师可以在完成每项开发任务之后&#xff0c;使用Selenuim做一下回归测试&#xff0c;以避免被提BUG太多导致后面做项目总结时太难看。测试工程师学习Selenium时需要掌握很多API接口&#xff0c;例如页…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...