首页 > 其他分享 >Qt 学习第 天:文件和事件

Qt 学习第 天:文件和事件

时间:2024-11-09 13:20:15浏览次数:3  
标签:文件 Qt 学习 ui QString file path include MainWindow

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

【运行结果】

 

标签:文件,Qt,学习,ui,QString,file,path,include,MainWindow
From: https://blog.csdn.net/CH3CH2CH4/article/details/143643456

相关文章

  • StarUML建模工具安装学习与汉化最新零基础详细教程【一键式下载】(适用于Windows、MacO
    StarUML破解安装下载教程前言:StarUML破解与汉化安装下载教程,仅供学习研究和交流使用,禁止作为商业用途或其他非法用途!仓库作者:X1a0He,经仓库作者授权使用。目录StarUML破解安装下载教程1.下载准备1.1一键式准备【懒人准备】1.2学习式准备1.2.1学习准备2.window......
  • 2024-2025-1 20241413 《计算机基础与程序设计》第七周学习总结
    这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK07作业目标数组与链表基于数组和基于链表实现数据结构无序表与有序表树图子程序与参数--------作业......
  • c++学习:封装继承多态
    目录封装封装的定义封装的好处封装的实例继承继承的定义继承的好处继承的实例多态多态的定义多态的好处多态的实例封装封装的定义封装是面向对象编程(OOP)中的一个核心概念,它指的是将数据(属性)和操作这些数据的函数(方法)结合在一起的过程,以此来模拟现实世界中的实......
  • Vue3 - 详细实现将多个文件批量导出为ZIP压缩包格式并下载功能,vue3将文件批量下载打包
    前言Vue2版本,请访问这篇文章。在vue3|nuxt3项目开发中,详解实现把多个文件组合成一个ZIP压缩包格式下载到用户本地,将文件批量下载打包成zip格式并自定义压缩包命名名称,vue3批量下载文件并导出为压缩包的功能,如何将后端返回的二进制文件流打包成zip格式,支持任意文件......
  • Java学习——Redis学习总结(一文搞定入门到精通)
    前言本文是我在日常学习中对redis方面学习的全面总结,分为三大模块。1.入门篇总结了redis的基础知识,限于入门redis,省略了redis的安装和客户端基础命令操作,着重与java客户端以及在java环境下如何操作redis2.进阶篇总结了redis的持久化,分布式锁,缓存,简单写了一点事务相关方面,......
  • Linux fsync和fdatasync系统调用实现分析(Ext4文件系统)
    Linux系统中,对文件系统上文件的读写一般是通过页缓存(pagecache)进行的(DirectIO除外),这样设计的可以延时磁盘IO的操作,从而可以减少磁盘读写的次数,提升IO性能。但是性能和可靠性在一定程度上往往是矛盾的,虽然内核中设计有一个工作队列执行赃页回写同磁盘文件进行同步,但是在一些极端的......
  • Beyond Compare 5 比较文本文件时,如何忽略字母的大小写差异?
    在BeyondCompare5中实现忽略字母大小写功能,可以按照以下步骤操作:打开文本比较会话:启动BeyondCompare5软件,单击主页面右侧“文本比较”会话图标,打开会话操作界面。单击界面内“打开文件”按钮,浏览并挑选需要比较的文本文件。此时,可能会看到因字母大小写不同而......
  • 强化学习理论-第二课-贝尔曼公式
    1.return和贝尔曼上图说明从不同状态出发得到的return,依赖于从其他状态出发的returnv是return,将第一张图写成矩阵的形式,r代表immediatereward,是已知的,矩阵P是策略加上statetransition,也是已知的,求解v这个公式实际上就是贝尔曼公式在\(S_t\)采用什么样的动作\(A_t\),是有......
  • 【YOLO11改进 - 注意力机制】添加YOLO-Face提出的SEAM注意力,提高遮挡情况下的特征学
    YOLOv11目标检测创新改进与实战案例专栏文章目录:YOLOv11创新改进系列及项目实战目录包含卷积,主干注意力,检测头等创新机制以及各种目标检测分割项目实战案例专栏链接:YOLOv11目标检测创新改进与实战案例文章目录YOLOv11目标检测创新改进与实战案例专栏介绍......
  • Pbootcms上传文件大小限制如何处理
    为了提高PBootCMS上传文件的大小限制,需要修改PHP配置文件 php.ini 以及可能涉及的其他配置文件。以下是详细的步骤:一、修改 php.ini 文件打开 php.ini 文件找到PHP安装目录下的 php.ini 文件。通常位于 /etc/php/7.x/fpm/php.ini 或 /etc/php/7.x/cli/php.ini。......