【Qt】文件操作/事件--mainwindow做编辑器

文件操作

1.找到文件位置:

返回一个文件的绝对路径=QFileDialog::getOpenFileName(父类对象,框名,显示的路径, 显示的文件的类型)

cpp 复制代码
QString fileName = QFileDialog::getOpenFileName(this,"打开",QCoreApplication::applicationFilePath(),"*.cpp");

2.创建文件对象

cpp 复制代码
 QFile file(fileName)

3.打开文件

cpp 复制代码
file.open(QIODevice::打开方式);

4.操作

读文件: QByteArray类写道的位置 = file.readAll(文件对象)

写文件:file.write(写的内容);

5.关闭文件

cpp 复制代码
file.close();

做编辑器

做一个有新建、打开、保存功能的文本编辑器。

UI部分

mainwindow的UI部分,比widget多一个在这里输入(菜单栏部分)

快捷键预览UI:alt+shift+r

拖一个text edit选垂直布局,自动占满:

菜单栏下拉:&+字母

下拉这里的操作不能直接右键转到槽,所以需要在代码中自己写connect,连接信号与槽。

mainwindow.h

声明槽函数(新建、打开、保存)。

cpp 复制代码
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include<QFileDialog>
#include<QMessageBox>
#include<QDebug>
#include<QFile>
QT_BEGIN_NAMESPACE
namespace Ui {
class MainWindow;
}
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void newActionSlot();//处理new的槽函数
    void openActionSlot();
    void saveActionSlot();
private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

mainwindow.cpp

手动连接槽函数:

&QAction::triggered是单击信号

cpp 复制代码
connect(ui->action_N,&QAction::triggered,this,&MainWindow::newActionSlot);
connect(ui->action_O,&QAction::triggered,this,&MainWindow::openActionSlot);
connect(ui->action_S,&QAction::triggered,this,&MainWindow::saveActionSlot);

新建槽

清空当前ui,原始名叫新建文本文档.txt

cpp 复制代码
void MainWindow::newActionSlot()
{
    ui->textEdit->clear();//清空当前的编辑部分
    this->setWindowTitle("新建文本文档.txt");//ui框叫新建文本文档.txt
}

打开槽(读文件)

取文件地址

如果为空:

警告warning没取到

否则:

打开文件file,

打开方式

读文件信息到ba

写ba到ui中

关闭文件

cpp 复制代码
void MainWindow::openActionSlot()
{
    //打开一个选文件的框
    
    QString fileName = QFileDialog::getOpenFileName(this,"打开",QCoreApplication::applicationFilePath(),"*.cpp");
    if(fileName.isEmpty())//返回空则没选到文件
    {
        QMessageBox::warning(this,"警告","请选择一个文件");
    }
    else
    {
        QFile file(fileName);//创建文件对象
        file.open(QIODevice::ReadOnly);//只读打开文件
        QByteArray ba = file.readAll();//读取文件信息,存到ba里面
        ui->textEdit->setText(QString(ba));//在UI中的textEdit中显示文本ba中的内容
        file.close();
    }
}

保存槽

取文件地址filename

如果为空:

警告

否则:

打开(filename)的文件file

在ui框里面写的追加到ba

file写ba

关闭文件

cpp 复制代码
void MainWindow::saveActionSlot()
{
    QString fileName = QFileDialog::getSaveFileName(this,"选择一个文件",QCoreApplication::applicationFilePath());
    if(fileName.isEmpty())
    {
        QMessageBox::warning(this,"警告","请选择一个文件");
    }
    else
    {
        //得到文件地址,打开方式
        QFile file(fileName);
        file.open(QIODevice::WriteOnly);

        QByteArray ba;
        ba.append(ui->textEdit->toPlainText().toUtf8());
        file.write(ba);
        file.close();
    }
}

事件

键盘、鼠标、拖放、滚轮、绘屏、定时......都是事件

QMouseEvent(鼠标事件)、QKeyEvent(键盘事件)、QResizeEvent(窗口大小变化事件)等,均继承自基类 QEvent。

常见的事件

  1. 鼠标事件(QMouseEvent):

    鼠标按下(mousePressEvent)、释放(mouseReleaseEvent)、移动(mouseMoveEvent)、双击(mouseDoubleClickEvent)等。

  2. 键盘事件(QKeyEvent):

    按键按下(keyPressEvent)、释放(keyReleaseEvent),可获取按键值(如 Qt::Key_Enter)。

  3. 窗口事件(QResizeEvent、QMoveEvent 等):

    窗口大小变化(resizeEvent)、位置移动(moveEvent)、关闭(closeEvent)等。

  4. 定时器事件(QTimerEvent):

    通过 startTimer(interval) 启动定时器,定时触发 timerEvent。

  5. 绘图事件(QPaintEvent):

    窗口需要重绘时触发(如被遮挡后显示),需在 paintEvent 中实现绘图逻辑(配合 QPainter)。

  6. 拖放事件(QDragEnterEvent、QDropEvent 等):

    处理拖放操作,需开启控件的 setAcceptDrops(true)。

重写 事件处理函数可以自定义事件处理方法。

例:写ctrl+s保存快捷键

键盘事件的头文件:<QKeyEvent>

键盘按下事件:

cpp 复制代码
//声明
void keyPressEvent(QKeyEvent *K);
//定义
void MainWindow::keyPressEvent(QKeyEvent *k)
{
    //同时按下ctrl+S
    if(k->modifiers() == Qt::ControlModifier && k->key()==Qt::Key_S)
    {//保存文件的槽函数处理
        saveActionSlot();
    }
}
相关推荐
tachibana24 小时前
与其他语言相比,使用 Go 有什么好处?
开发语言·后端·golang·go
阿俊-全栈开发8 小时前
LikeShop 单商户SaaS商城分销模块二开:佣金计算与结算逻辑实现
java·开发语言·微服务·likeshop·likeshop开源商城·likeshop多商户
m0_3807438711 小时前
C++中的freopen的用法实例详解
开发语言·c++
Escalating_xu12 小时前
【Python】基础语法(1):常量、变量、类型、输入输出与运算符
开发语言·python
jimy112 小时前
polymorph.cpp里面的“析构函数、智能指针”问题
开发语言·c++
m0_3807438712 小时前
PHP 8.3 缓存清除不生效怎么排查
开发语言·php
朝朝辞暮i12 小时前
C++ 第 6 课:switch —— 多状态选择
开发语言·c++·算法
小凡geo13 小时前
本地商家 GEO:用脚本一键生成 FAQPage 结构化数据,让 AI 切片更稳
开发语言·人工智能·python·microsoft·搜索引擎·ai
朝朝辞暮i13 小时前
C++ 第 4 课:if / else —— 让程序自己做决定
开发语言·c++
波力海苔夹心脆67513 小时前
C# 值类型与引用类型详解:存储位置、赋值机制、参数传递、相等比较、装箱拆箱与常见陷阱
开发语言·jvm·经验分享·笔记·c#·.net