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

news2024/11/13 10:10:28

一、创建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();
}

【运行结果】

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

华为ensp配置bgp(避坑版)

文章目录 前言一、BGP是什么&#xff1f;二、拓扑三、基础配置四、测试五、拓展总结 前言 BGP&#xff08;Border Gateway Protocol&#xff0c;边界网关协议&#xff09;是一种在互联网中使用的路径矢量协议。它主要用于在不同的自治系统&#xff08;AS&#xff09;之间交换路…

QT最新版6.8在线社区版安装教程

访问QT的官网&#xff1a; Qt | Tools for Each Stage of Software Development Lifecycle 点击 Download Try&#xff1a; 点击社区版最新在线安装&#xff1a; 往下翻网页&#xff0c; 点击下载&#xff1a; 开始安装&#xff1a; 使用--mirror进行启动安装程序&#xff1…

鸿蒙多线程开发——Worker多线程

1、概 述 1.1、基本介绍 Worker主要作用是为应用程序提供一个多线程的运行环境&#xff0c;可满足应用程序在执行过程中与主线程分离&#xff0c;在后台线程中运行一个脚本进行耗时操作&#xff0c;极大避免类似于计算密集型或高延迟的任务阻塞主线程的运行。 创建Worker的线…

海量数据迁移:Elasticsearch到OpenSearch的无缝迁移策略与实践

文章目录 一&#xff0e;迁移背景二&#xff0e;迁移分析三&#xff0e;方案制定3.1 使用工具迁移3.2 脚本迁移 四&#xff0e;方案建议 一&#xff0e;迁移背景 目前有两个es集群&#xff0c;版本为5.2.2和7.16.0&#xff0c;总数据量为700T。迁移过程需要不停服务迁移&#…

在配置环境变量之后使用Maven报错 : mvn : 无法将“mvn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。

最近&#xff0c;我在 Windows 系统上安装和配置 Apache Maven 时遇到了一些问题&#xff0c;想在此记录下我的解决历程&#xff0c;希望对遇到类似问题的朋友有所帮助。 问题描述 我下载了 Maven 并按照常规步骤配置了相关的环境变量。然而&#xff0c;在 PowerShell 中输入…

大模型,智能家居的春秋战国之交

智能家居&#xff0c;大家都不陌生。尽管苹果、谷歌、亚马逊等AI科技巨头&#xff0c;以及传统家电厂商都在积极进入这一领域&#xff0c;但发展了十多年之后&#xff0c;智能家居依然长期呈现出一种技术上人工智障、市场上四分五裂的局面。 究其原因&#xff0c;是此前传统家电…

【设计模式】结构型模式(四):组合模式、享元模式

《设计模式之结构型模式》系列&#xff0c;共包含以下文章&#xff1a; 结构型模式&#xff08;一&#xff09;&#xff1a;适配器模式、装饰器模式结构型模式&#xff08;二&#xff09;&#xff1a;代理模式结构型模式&#xff08;三&#xff09;&#xff1a;桥接模式、外观…

众测遇到的一些案列漏洞

文章中涉及的敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打码处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任,一旦造成后果请自行…

算法求解(C#)-- 寻找包含目标字符串的最短子串算法

1. 引言 在字符串处理中&#xff0c;我们经常需要从一个较长的字符串中找到包含特定目标字符串的最短子串。这个问题在文本搜索、基因序列分析等领域有着广泛的应用。本文将介绍一种高效的算法来解决这个问题。 2. 问题描述 给定一个源字符串 source 和一个目标字符串 targe…

ThingsBoard规则链节点:RPC Call Reply节点详解

引言 1. RPC Call Reply 节点简介 2. 节点配置 2.1 基本配置示例 3. 使用场景 3.1 设备控制 3.2 状态查询 3.3 命令执行 4. 实际项目中的应用 4.1 项目背景 4.2 项目需求 4.3 实现步骤 5. 总结 引言 ThingsBoard 是一个开源的物联网平台&#xff0c;提供了设备管理…

动态规划(简单多状态 dp 问题 1.按摩师 2.打家劫舍 II 3. 删除并获得点数 4.粉刷房子 5.买卖股票的最佳时机(全系列))

面试题 17.16. 按摩师213. 打家劫舍 II740. 删除并获得点数LCR 091. 粉刷房子 &#xff08;原&#xff1a;剑指 Offer II 091. 粉刷房子&#xff09;309. 买卖股票的最佳时机含冷冻期714. 买卖股票的最佳时机含手续费123. 买卖股票的最佳时机 III188. 买卖股票的最佳时机 IV 1.…

【VBA实战】用Excel制作排序算法动画续

为什么会产生用excel来制作排序算法动画的念头&#xff0c;参见【VBA实战】用Excel制作排序算法动画一文。这篇文章贴出我所制作的所有排序算法动画效果和源码&#xff0c;供大家参考。 冒泡排序&#xff1a; 插入排序&#xff1a; 选择排序&#xff1a; 快速排序&#xff1a;…

关于Markdown的一点疑问,为什么很多人说markdown比word好用?

markdown和word压根不是一类工具&#xff0c;不存在谁比谁好&#xff0c;只是应用场景不一样。 你写博客、写readme肯定得markdown&#xff0c;但写合同、写简历肯定word更合适。 markdown和word类似邮箱和微信的关系&#xff0c;这两者都可以通信&#xff0c;但微信因为功能…

区块链技术在数字版权管理中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 区块链技术在数字版权管理中的应用 区块链技术在数字版权管理中的应用 区块链技术在数字版权管理中的应用 引言 区块链技术概述 …

基于Spring Boot的在线装修管理系统的设计与实现,LW+源码+讲解

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#…

Ollama 0.4 发布!支持 Llama 3.2 Vision,实现多模态 RAG

“ 阅读本文大概需要5分钟。 前言 最近&#xff0c;Ollama 推出了 0.4 版本&#xff0c;其中最大的亮点就是支持了 Llama 3.2 Vision 模型&#xff0c;该模型具备多模态特性&#xff0c;也就是说能够理解图像并将图像纳入提示词中进行处理&#xff0c;让模型更智能地处理RAG中…

关于若依500验证码问题的求助

关于若依框架中验证码出现500错误的问题&#xff0c;这通常表示服务器内部错误。以下是一些可能的原因及解决方案&#xff1a; 一、配置文件问题 .env.production文件&#xff1a; 确保.env.production文件中的VUE_APP_BASE_API已经修改成服务器上的域名地址&#xff0c;而不…

使用HtmlAgilityPack+PuppeteerSharp+iText7抓取IdentityServer4帮助文档

需要学习IdentityServer4的用法&#xff0c;但是在IdentityServer4帮助文档网站&#xff08;参考文献1&#xff09;中没有找到下载离线文档的地方&#xff0c;准备使用HtmlAgilityPackPuppeteerSharpiText7将网站内容抓取生成离线PDF文档&#xff0c;便于本机学习、查看。   …

fpga开发原理图设计仿真分析

目录 原理图设计方法的流程 仿真分析 method1. 基于向量波形的仿真方法 method2. 基于testbench的仿真方法 在Quartus Prime开发环境下&#xff0c;进行EDA设计的基本流程如图所示。 包括五个主要任务: (1) 建立工程 (2) 设计输入 (3) 编译、综合与适配 (4) 引脚…

Node.js——fs模块-路径补充说明

1、相对路径&#xff1a; ./座右铭.txt 当前目录下的座右铭.txt座右铭.txt 等效于上面的写法../座右铭.txt 当前目录的上一级目录中的座右铭.txt 2、绝对路径 D&#xff1a;/Program File Windows系统下的绝对路径/usr/bin Linux系统…