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_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    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_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    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();
}

【运行结果】

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

javascript实现sha512和sha384算法(支持微信小程序),可分多次计算

概述&#xff1a; 本人前端需要实现sha512和sha384计算的功能&#xff0c;最好是能做到分多次计算。 本文所写的代码在现有sha512和sha384的C代码&#xff0c;反复测试对比计算过程参数&#xff0c;成功改造成sha512和sha384的javascript代码&#xff0c;并成功验证好分多次计算…

Golang--反射

1、概念 反射可以做什么? 反射可以在运行时动态获取变量的各种信息&#xff0c;比如变量的类型&#xff0c;类别等信息如果是结构体变量&#xff0c;还可以获取到结构体本身的信息(包括结构体的字段、方法)通过反射&#xff0c;可以修改变量的值&#xff0c;可以调用关联的方法…

释放专利力量:Patently 如何利用向量搜索和 NLP 简化协作

作者&#xff1a;来自 Elastic Matt Scourfield, Andrew Crothers, Brian Lambert 组织依靠知识产权 (IP) 来推动创新、保持竞争优势并创造收入来源。对于希望将新产品推向市场的公司来说&#xff0c;弄清楚谁拥有哪些专利是一项必不可少的能力。搜索数百万项专利可能既困难又耗…

[Linux] 进程等待 | 进程替换

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;青果大战linux 总有光环在陨落&#xff0c;总有新星在闪烁 我有一个朋友&#x…

【EasyExcel】EasyExcel导出表格包含合计行、自定义样式、自适应列宽

目录 0 EasyExcel简介1 Excel导出工具类设置自定义表头样式设置自适应列宽添加合计行 2 调用导出工具类导出Excel表3 测试结果 0 EasyExcel简介 在数据处理和报表生成的过程中&#xff0c;Excel是一个非常常用的工具。特别是在Java开发中&#xff0c;EasyExcel库因其简单高效而…

深度优先搜索之全排列问题(C语言版)

本文的一些参考&#xff1a; DFS (深度优先搜索) 算法详解 模板 例题&#xff0c;这一篇就够了_dfs算法-CSDN博客 首先把深度优先搜索算法的基本概论摆出来 深度优先搜索算法&#xff08;Depth First Search&#xff0c;简称DFS&#xff09;&#xff1a; 一种用于遍历或搜…

【Docker】自定义网络:实现容器之间通过域名相互通讯

文章目录 一. 默认网络&#xff1a;docker0网络的问题二. 自定义网络三. nginx容器指之间通过主机名进行内部通讯四. redis集群容器&#xff08;跳过宿主机&#xff09;内部网络通讯1. 集群描述2. 基于bitnami镜像的环境变量快速构建redis集群 一. 默认网络&#xff1a;docker0…

Serverless+AI,前沿技术

大家好&#xff0c;我是袁庭新。如果想在未来成为一名合格且具备前瞻视野的软件开发工程师&#xff0c;新兴且热门的技术领域都是需要去了解的&#xff08;例如包括ServerlessAI、AI可观测性、以及AI原生应用架构&#xff09;&#xff0c;并且在参加工作前尽可能去系统学习掌握…

开放式耳机如何选择?五款千万不能错过的开放式耳机机型推荐

在这里我先做一个行业的知识科普&#xff0c;目前市场上有超过80%的品牌&#xff0c;都是非专业的开放式耳机品牌&#xff0c;也就是跨界大牌或者网红品牌&#xff0c;这些品牌由于没有开放式声学的技术沉淀&#xff0c;在制作开放式耳机的时候&#xff0c;通常都是直接套用传统…

力扣17-电话号码的数字组合

力扣17-电话号码的数字组合 思路代码 题目链接 思路 原题&#xff1a; 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 输…

鸿蒙进阶篇-剩余和展开、简单和复杂类型

“在科技的浪潮中&#xff0c;鸿蒙操作系统宛如一颗璀璨的新星&#xff0c;引领着创新的方向。作为鸿蒙开天组&#xff0c;今天我们将一同踏上鸿蒙基础的探索之旅&#xff0c;为您揭开这一神奇系统的神秘面纱。” 各位小伙伴们我们又见面了,我就是鸿蒙开天组,下面让我们进入今…

【复平面】-复数相乘的几何性质

文章目录 从数学上证明1. 计算乘积 z 1 ⋅ z 2 z_1 \cdot z_2 z1​⋅z2​2. 应用三角恒等式3. 得出结果 从几何角度证明1.给出待乘的复数 u i u_i ui​2.给出任意复数 l l l3.复数 l l l 在不同坐标轴下的表示图 首先说结论&#xff1a; 在复平面中&#xff0c;两个复数&a…

【EMNLP2024】基于多轮课程学习的大语言模型蒸馏算法 TAPIR

近日&#xff0c;阿里云人工智能平台PAI与复旦大学王鹏教授团队合作&#xff0c;在自然语言处理顶级会议EMNLP 2024 上发表论文《Distilling Instruction-following Abilities of Large Language Models with Task-aware Curriculum Planning》。文章提出了一个名为 TAPIR 的知…

Web服务nginx基本实验

安装软件&#xff1a; 启动服务&#xff1a; 查看Nginx服务器的网络连接信息&#xff0c;监听的端口&#xff1a; 查看默认目录&#xff1a; 用Windows访问服务端192.168.234.111的nginx服务&#xff1a;&#xff08;防火墙没有放行nginx服务&#xff0c;访问不了&#xff09; …

github使用基础

要通过终端绑定GitHub账号并进行文件传输&#xff0c;你需要使用Git和SSH密钥来实现安全连接和操作。以下是一个基本流程&#xff1a; 设置GitHub和SSH 检查Git安装 通过终端输入以下命令查看是否安装Git&#xff1a; bash 复制代码 git --version配置Git用户名和邮箱 bash …

excel常用技能

1.基础技能 1.1 下拉框设置 a. 选中需要设置的列或单元格&#xff0c;数据 ---》 数据验证 b.验证条件 ---> 序列&#xff08;多个值逗号隔开&#xff09; 2.函数 2.1 统计函数-count a.count(区域&#xff0c;区域&#xff0c;......) 统计数量&#xff0c;只针…

Flipper Zero BadUSB反弹shell

Flipper Zero BadUSB反弹shell 前置知识点&#xff1a; Flipper Zero BadUSB 以及其他几个 BadUSB 设备使用用 DuckyScript 编写的有效负载。一种简单的脚本语言&#xff0c;用于执行导致键盘注入攻击的击键。 步骤 创建rev_shell_win.txt文件,并将其拖到badusb文件夹中. 相…

【GPTs】Email Responder Pro:高效生成专业回复邮件

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | GPTs应用实例 文章目录 &#x1f4af;GPTs指令&#x1f4af;前言&#x1f4af;Email Responder Pro主要功能适用场景优点缺点 &#x1f4af;小结 &#x1f4af;GPTs指令 Email Craft is a specialized assistant for cra…

检测敏感词功能

今天策划给我一个任务 —— 检测昵称中是否含有敏感词功能&#xff0c;然后丢给我两个压缩包&#xff0c;我解压一看&#xff1a; 有的txt文件是一行一个词&#xff1a; 有的txt文件是按逗号分隔开&#xff1a; 不管是什么格式的总之量非常多&#xff0c;把我这辈子脏话都囊括…

【SpringBoot】19 文件/图片下载(MySQL + Thymeleaf)

Git仓库 https://gitee.com/Lin_DH/system 介绍 从 MySQL 中&#xff0c;下载保存的 blob 格式的文件。 代码实现 第一步&#xff1a;配置文件 application.yml spring:jackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT8datasource:driver-class-name: com.mysql.…