当前位置: 首页 > 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;例如页…...

C++指针使用指南

指针 适合指针的情况 动态内存管理 C 语言中&#xff0c;malloc、calloc 和 free 等函数用于动态分配和释放内存&#xff0c;这些函数返回的都是指针类型。通过指针&#xff0c;可以动态创建和管理内存区域&#xff0c;尤其在需要动态数组或复杂数据结构&#xff08;如链表、…...

一文学会,利用LLaMA 3.2打造能“识图断字”的个人AI助理

人工智能最直接也是最普及的应用之一肯定是聊天机器人&#xff0c;或者叫个人 AI 助理。尽管聊天机器人以各种形式存在了30年&#xff0c;但在过去两年中&#xff0c;这些个人AI助理才真正成为热门应用。它们已经从前沿技术范畴落地到生活的各个方面、社交场合和商业场景中。 虽…...

idea的mapper.xml文件里写sql语句出现Tag name expected错误提示

原因如下&#xff1a; xml文件的某些特殊字符是自动转义的, xml解析器会忽视CDATA中的内容 解决方法&#xff1a; 使用下面的表达式表示对应符号。 小于(<)&#xff1a;<大于(>)&#xff1a;>和号(&)&#xff1a;&amp;单引号()&#xff1a;&apos;双引…...

EasyExcel 使用多线程按顺序导出数据

通过多线程读取数据&#xff0c;使用EasyExcel按顺序导出数据 导出时如果要保证顺序需要使用单线程&#xff0c;但是查询时可以用多线程&#xff0c;因为多线程查询后返回数据不是按照顺序排列的&#xff0c;所以我的思路是再循环时给每个线程打标识&#xff0c;通过标识来排序…...

数据驱动的投资分析:民锋科技的量化模型探索

在全球金融市场中&#xff0c;数据驱动的投资分析正在变革传统投资方式。民锋科技通过精密的量化模型和智能算法&#xff0c;为投资者提供更加科学的市场预测和投资分析工具&#xff0c;以帮助他们更好地理解市场波动、优化投资组合&#xff0c;实现风险管理。 #### 一、数据驱…...

cesium 设置相机视角 flyTo 参数destination,orientation

效果 // 监听相机的改变 用来设置相机飞行到哪里window.viewer.camera.changed.addEventListener(function () {// 当相机改变时&#xff0c;获取相机的参数let camera window.viewer.camera;// 获取当前摄像机的位置&#xff08;经纬度&#xff09;let cameraPosition wind…...

vue+Leaflet.PM插件实现创建和编辑几何图形(点、线、面、圆等)

场景 VueLeaflet实现加载OSM显示地图&#xff1a;https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/122317394在上面加载显示OSM的基础上&#xff0c;使用Leaflet.pm插件实现在页面上绘制、编辑、剪切、移动几何元素。Leaflet.pm插件 用于创建和编辑几何图层的插件可…...

Rust语言在系统编程中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 Rust语言在系统编程中的应用 Rust语言在系统编程中的应用 Rust语言在系统编程中的应用 引言 Rust 概述 定义与原理 发展历程 Ru…...

test 是 JavaScript 中正则表达式对象 (RegExp) 的一种方法,用于测试一个字符串是否匹配某个正则表达式

在你的代码中&#xff0c;test 方法用于验证扫描结果是否符合特定的格式要求。具体来说&#xff0c;/^[A-Za-z\d]{16}$/.test(res.result) 这一行代码用于检查扫描结果 res.result 是否是一个由16个字母或数字组成的字符串。 test 方法的作用 正则表达式匹配&#xff1a; ^ 表…...

大厂社招3年-力扣热点高频刷题记录(已更新100+道热点题)

前言&#xff1a; 最近从大厂出来看机会&#xff0c;大厂面试基本都考察算法&#xff0c;于是维护此文档&#xff0c;一是查缺补漏&#xff0c;确保整体热点算法题目的应知应会&#xff0c;与思路的灵活理解&#xff1b;二是分享出来给其他同学朋友做一个参考借鉴&#xff0c;共…...