Qt——文本编辑器中的数据存取

1.QAction被点击之后会产生一个triggered信号

  • 通过信号与槽的机制能够捕捉对QAction对象的操作
  • 项目中可以将多个信号映射到同一个槽函数

2.完善记事本中打开文件、保存文件、另存为功能

在MainWindow.h中加入三个槽函数

复制代码
public slots:
    void onFileOpen(); //打开文件槽函数
    void onFileSave(); //保存文件槽函数
    void onFileSaveAs(); //另存为槽函数

在MainWindowUI.cpp中添加关联代码:

connect(action, SIGNAL(triggered()), this, SLOT(onFileSaveAs()));

新建MainWindowSlots.cpp,实现具体的槽函数:

复制代码
#include "MainWindow.h"
#include <QFileDialog>
#include <QDebug>
#include <QFile>
#include <QMessageBox>
#include <QTextStream>

void MainWindow::showErorrMessage(QString message){
    QMessageBox msg(this);

    msg.setWindowTitle("Error");
    msg.setText(message);
    msg.setIcon(QMessageBox::Critical);
    msg.setStandardButtons(QMessageBox::Ok);
    msg.exec();
}
QString MainWindow::showFileDialog(QFileDialog::AcceptMode mode, QString title)
{
    QString ret = "";

    QFileDialog fd(this); //创建一个文件对话框对象
    QStringList filters; //创建一个字符串列表 filters,用来存储文件过滤器

    filters.append("Text Files (*.txt)");
    filters.append("All Files (*)");

    fd.setWindowTitle(title); //设置文件对话框的标题
    fd.setAcceptMode(QFileDialog::AcceptOpen); //设置对话框模式为打开文件
    fd.setNameFilters(filters);

    if( mode == QFileDialog::AcceptOpen )
    {
        fd.setFileMode(QFileDialog::ExistingFile); //设置文件选择模式:只能选择已存在的单个文件
    }

    if( fd.exec() == QFileDialog::Accepted ) //如果用户点击了对话框的 "打开" 按钮
    {
        ret = fd.selectedFiles()[0];
    }
    return ret;
}
void MainWindow::onFileOpen()
{
    QString path = showFileDialog(QFileDialog::AcceptOpen, "Open");
    if( path != "" )
    {
        QFile file(path); //绑定用户选中的第一个文件路径
        if( file.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            //把读取到的文件内容显示到编辑器中
            mainEditor.setPlainText(QString(file.readAll()));
            file.close();
            m_filePath = path;
            setWindowTitle("NotePad - [ " + m_filePath + " ]");
        }
        else{
            showErorrMessage(QString("open file error! \n\n") + "\"" + path + "\""));
        }
    }
}

void MainWindow::onFileSave()
{
    if( m_filePath == "" )
    {
        m_filePath = showFileDialog(QFileDialog::AcceptSave, "Save");
    }
    if( m_filePath != "" )
    {
        QFile file(m_filePath);
        if( file.open(QIODevice::WriteOnly | QIODevice::Text) )
        {
            QTextStream out(&file);
            out << mainEditor.toPlainText();
            file.close();
            setWindowTitle("NotePad - [ " + m_filePath + " ]");
        }
        else{
            showErorrMessage(QString("Save file error! \n\n") + "\"" + m_filePath + "\"");
            m_filePath = "";
        }
    }
}
void MainWindow::onFileSaveAs()
{
    QString path = showFileDialog(QFileDialog::AcceptSave, "Save As");
    if( path != "" )
    {
        QFile file(path);
        if( file.open(QIODevice::WriteOnly | QIODevice::Text) )
        {
            QTextStream out(&file);
            out << mainEditor.toPlainText();
            file.close();
            m_filePath = path;
            setWindowTitle("NotePad - [ " + m_filePath + " ]");
        }
        else{
            showErorrMessage(QString("Save file error! \n\n") + "\"" + path + "\"");
        }
    }
}
相关推荐
2601_966949652 小时前
如何根据研究的起止时间截取分钟级行情?Python 实战与 QuantDash 数据处理指南
开发语言·python·pandas·量化交易·1024程序员节·股票数据·quantdash
晨曦中的暮雨4 小时前
限流算法——固定窗口、滑动窗口、漏桶、令牌桶
java·开发语言·算法
喵了几个咪5 小时前
GoWind CMS 拆解:在 Go 里给 TipTap 搭一套 Yjs 协同后端
开发语言·后端·golang
程序员清风5 小时前
数据处理脚本工程化:日志、配置、命令行与测试
服务器·开发语言·数据库
2601_962885727 小时前
如何用 Python 把 K 线重采样成任意周期?
开发语言·python
Wang's Blog7 小时前
Java 项目实战: 交友项目 - 圈子功能实现:总结
java·开发语言·交友
下一站春风里8 小时前
位运算完整学习笔记:按位与(&)+ 异或(^)
开发语言·c++·算法
天外飞雨道沧桑9 小时前
我在浏览器里练了一个 792 参数的大模型,它学会了补全 JavaScript
开发语言·javascript·ai·ecmascript·ai编程
hhhjhl9 小时前
Yup 跨端三方库仓颉适配全流程
java·开发语言
运维行者_9 小时前
网络监控工具怎么选?从设备监控到智能运维的能力清单
运维·服务器·开发语言·网络·人工智能·支持向量机·php