9.19号作业

2023-09-19 22:56:45

2> 完成文本编辑器的保存工作

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QFontDialog>
#include <QFont>
#include <QMessageBox>
#include <QDebug>
#include <QColorDialog>
#include <QColor>
#include <QFileDialog>
#include <QFile>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

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

private slots:
    void on_ziti_clicked();

    void on_color_clicked();

    void on_open_clicked();

    void on_baocun_clicked();

private:
    Ui::Widget *ui;
};
#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_ziti_clicked()
{
    bool ok;                  //返回用户是否选中字体
    QFont f=QFontDialog::getFont(&ok,
                         QFont("隶书",10,10,false),
                         this,
                         "选择字体");
    //对OK进行判断,判断用户是否选中字体了
    if(ok)
    {
        //用户选中可以使用,该字体
       // ui->textEdit->setFont(f);                            //只能设置全部文字字体
        ui->textEdit->setCurrentFont(f);                 //设置选中的字体
        //ui->textEdit->setFontItacil(true);           //倾斜选中的字
    }else
    {
        //
            QMessageBox::information(this,"取消","用户取消了字体");
    }
}

void Widget::on_color_clicked()
{
    QColor c=QColorDialog::getColor(QColor("green"),
                                    this,
                                    "选择颜色");
    if(c.isValid())
    {
        //用户选择的颜色
        //将用户选择的颜色作用到文本上
        //ui->textEdit->setTextColor(c);            //设置字体颜色
        ui->textEdit->setTextBackgroundColor(c);
    }
    else 
    {
        QMessageBox::information(this,"取消","用户取消了颜色");
    }
    
}


void Widget::on_open_clicked()
{
    //
    QString fileName=QFileDialog::getOpenFileName(this,
                                                  "选择文件",
                                                  "./",
                                                  "ALL(*.*);;Images(* . png *.xpm*.jpg);;Text file (*.txt)");


        if(fileName.isNull())
        {
            QMessageBox::information(this,"提示","用户取消了选择文件");
            return ;
        }
        qDebug()<<fileName;


    //文件操作
    //1.实例化一个对象
    QFile file(fileName);
    //2.打开文件
    if(!file.isOpen())
    {
        //
        if(!file.open(QFile::ReadWrite))
        {
            QMessageBox::critical(this,"失败","文件打开失败");
            return ;
        }
    }
    //3.读写操作
    QByteArray msg=file.readAll();
    //4.关闭文件
    file.close();
    //将读取的文本展示在ui界面
    ui->textEdit->setText(msg);

}


void Widget::on_baocun_clicked()
{
        QString fileName=QFileDialog::getSaveFileName(this,
                                                  "选择文件",
                                                 "./",
                                           "ALL(*.*);;Images(* . png *.xpm*.jpg);;Text file (*.txt)");

        if(fileName.isNull())
        {
            QMessageBox::information(this,"提示","用户取消了选择文件");
            return ;
        }
        qDebug()<<fileName;
        //实例化一个对象
        QFile file(fileName);
        if(!file.isOpen())
        {
            //
            if(!file.open(QFile::ReadWrite))
            {
                QMessageBox::critical(this,"失败","文件打开失败");
                return ;
            }

        QString msg1=ui->textEdit->toPlainText();
        file.write(msg1.toLocal8Bit());
        }
        else {
            QMessageBox::information(this,"","文件保存失败");
        }

}

widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTimerEvent>
#include <QTime>
#include <QLineEdit>
#include <QDebug>
#include <QTextToSpeech>          //文本转语音类
#include<QVoice>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
       void timerEvent(QTimerEvent *e) override;

private slots:
       void on_pushButton_clicked();

       void on_pushButton_2_clicked();

private:
    Ui::Widget *ui;
        int timer_id;             //定时器的id号
        //定义一个播报员
    QTextToSpeech *speecher;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //给播报员实例化空间
    speecher = new QTextToSpeech(this);
    ui->QtextEdit->insertPlainText("早岁哪知世事\n仍许飞鸿荡人间\n千磨万击心铸铁\n殚精竭虑铸一剑");
}

Widget::~Widget()
{
    delete ui;
}


void Widget::on_pushButton_clicked()
{
        timer_id = this->startTimer(1000);
        //功能:启动一个定时器
        //参数:超时时间,每隔给定的时间后,自动调用定时器事件处理函数
        //返回值:当前定时器的id号
}
//定时器事件处理函数
void Widget::timerEvent(QTimerEvent *e)
{
    if(e->timerId() == timer_id)         //说明定时器1到位
    {
        QTime sys_t = QTime::currentTime();          //获取系统时间
        //将QTime类对象转换为字符串
        QString t = sys_t.toString("hh:mm:ss");
        //展示到ui界面
        ui->QLabeltime->setText(t);

    if(t==ui->QLineEdit->text())
    {
            speecher->say(ui->QtextEdit->toPlainText());
    }
    }
}
void Widget::on_pushButton_2_clicked()
{
        this->killTimer(timer_id);           //关闭给定的定时器
}

main.cpp

#include "widget.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

3.思维导图

更多推荐

AI大模型服务上线,助力企业AI大模型应用落地

在数字时代的浪潮中,人工智能(AI)技术的发展和应用已经深入到我们生活的方方面面。其中,企业AI大模型作为AI技术的重要形式之一,正在成为推动企业创新、提高效率和优化决策的关键力量。为顺应AI大模型的新趋势需求,近日,AI大模型服务,为企业提供高度定制化的AI大模正式上线,助力企业AI大模型应用落地,打造企业二次增长曲

linux驱动开发--day4(字符设备驱动注册内部流程、及实现备文件和设备的绑定下LED灯实验)

一、字符设备驱动注册的内部过程1.分配structcdev对象空间2.初始化structcdev对象3.注册cdev对象二、注册字符设备驱动分步实现1.分配字符设备驱动对象2.字符设备驱动对象初始化3.设备号的申请4.根据申请的设备号和驱动对象注册驱动三、open函数回调驱动中操作方法open的路线1.应用层打开文件系

一文读懂 Redis 缓存系统

【摘要】本文介绍了Redis缓存原理、详细解析了缓存模型、缓存一致性和缓存异常场景。【作者】李杰,专注于Java虚拟机技术、云原生技术领域的探索与研究。尽管(关系型)数据库系统(SQL)带来了许多出色的属性,例如ACID,但为了保持这些属性,数据库的性能在“3高”条件环境下下往往显得捉襟见肘、苍白无力。为了解决这个问题

nodejs定时任务

项目需求:1.每5秒执行一次,多个定时任务错开,即cron表达式中斜杆前带数字,例如‘1/5*****’2.定时任务准时,延误低搜索了nodejs的定时任务,其实不多,找到了以下三个:node-cronnode-schedulecronnode-cron示例代码constnodeCron=require('node-c

Unity粒子系统ParticleSystem各模块及其参数学习

粒子系统控制面板默认有4个模块:ParticleSystem(主模块),Emission(发射模块),Shape(形状模块),Renderer(渲染器模块)1.ParticleSystem模块包含了影响整个粒子系统的全局设置,主要用来初始化粒子系统,例如设置例子初始化时间、循环方式、初始速度、颜色、大小等基本参数Dur

短视频矩阵系统源码开发搭建技术解析-PHP语言

一、系统架构整个短视频矩阵系统大概分为以下几个模块:1.多平台账号管理支持抖音、快手、小红书、西瓜、头条视频号等多平台账号管理。2.视频管理模块支持视频批量上传、批量剪辑、文字转语音,特效等功能配置3.推荐算法模块推荐算法模块主要用来推荐用户感兴趣的视频,包括基于用户个人数据、基于视频分类标签、基于热度等推荐方法。4.

服务器迁移:无缝过渡指南

🌷🍁博主猫头虎(🐅🐾)带您GotoNewWorld✨🍁🦄博客首页——🐅🐾猫头虎的博客🎐🐳《面试题大全专栏》🦕文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》🐾学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》🐅学会Gol

华为hcie认证考试怎么考?

华为HCIE认证考试怎么考?前文腾科也说了HCIE认证考试的难度会比较大,具体是难在哪里呢?华为HCIE认证的考试需要考一门笔试,笔试主要是单选、多选、判断、填空、拖拽这几个题型,考试时长一般是一个半小时,试题的数量不等正常情况下是50至70题,笔试的总分是1000分,考到600分就算是通过了。在笔试通过且笔试成绩在有

Redis面试题(四)

文章目录前言一、锁互斥机制二、watchdog自动延期机制三、可重入加锁机制四、释放锁机制五、上述Redis分布式锁的缺点六、使用过Redis分布式锁么,它是怎么实现的?总结前言锁互斥机制watchdog自动延期机制可重入加锁机制释放锁机制上述Redis分布式锁的缺点使用过Redis分布式锁么,它是怎么实现的?`一、锁

ion-dipole forces and ion bonding ‘s differences

Ion-dipoleforcesandionbondingarebothtypesofinteractionsbetweenionsandpolarmolecules,buttheyhavedistinctdifferences:1.**NatureofInteraction**:-**Ion-DipoleForces

JavaScript 运行时比较: Node.js、 Deno 和 Bun

文章目录为什么选择正确的JavaScript运行时很重要介绍JavaScript运行时Node.jsDenoBun比较JavaScript运行时性能社区稳定性安全附加功能小结JavaScript运行时可帮助您构建高级的、服务器驱动的JavaScript项目,这些项目不依赖于用户的浏览器来运行。有几种运行时可供选择,老牌

热文推荐