QT学习笔记4:记事本.exe

本文详细介绍了一个基于Qt的文本编辑器的界面设计与文件操作功能实现,包括菜单栏的创建、文件的打开与保存、字体格式设置以及换行模式调整。

界面效果及所实现功能

在这里插入图片描述
所实现功能:
1.新建、打开文件、保存文件、另存为
2.确定是否自动换行
3.字体的格式

全部代码

在这里插入图片描述

mainwindow.h:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
class QFile;               //申明,也可用#include <QFile>
class QTextEdit;           //申明,也可用#include <QTextEdit>

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
private slots:
        void xzk_newslot();
        void xzk_openslot();
        void xzk_saveslot();
        bool xzk_saveAsslot();
        void xzk_closeslot();
        void xzk_fontslot();

private:
    void initMenu();
private:
    QFile* _file;
    QTextEdit* _text;
    QString _curPath;
};

#endif // MAINWINDOW_H

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

mainwindow.cpp:

#include "mainwindow.h"
#include <QMenuBar>
#include <QMenu>
#include <QTextEdit>
#include <QAction>
#include <QFile>
#include <QFileDialog>
#include <QMessageBox>
#include <QFontDialog>
#include <QFont>


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    _file = new QFile(this);    //用来保存文件
    _text =new QTextEdit(this);  //用来保存文本
    this->setCentralWidget(_text);
    initMenu();


}
void MainWindow::initMenu()
{
    QMenuBar* menubar =this->menuBar();

    /*设置文件IO*/
    QMenu* filemenu =menubar->addMenu("文件(&F)");
    filemenu->addAction("新建" ,this ,SLOT(xzk_newslot()) ,QKeySequence("Ctrl+N"));
    filemenu->addAction("打开" ,this ,SLOT(xzk_openslot()) ,QKeySequence("Ctrl+O"));
    filemenu->addAction("保存" ,this ,SLOT(xzk_saveslot()) ,QKeySequence("Ctrl+S"));
    filemenu->addAction("另存为" ,this ,SLOT(xzk_saveAsslot()));
    filemenu->addAction("关闭" ,this ,SLOT(xzk_closeslot()) ,QKeySequence("Ctrl+Q"));

    /*设置换行格式*/
    QMenu* stylemenu =menubar->addMenu("是否换行(&s)");
    QAction* wrapAction = stylemenu->addAction("换行(w)"
                          ,[&](bool ischecked){
                                            ischecked ? _text->setWordWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere)
                                            : _text->setWordWrapMode(QTextOption::NoWrap);});
    wrapAction->setCheckable(true);
    wrapAction->setChecked(true);
    /*设置字体格式*/
    QMenu* fontmenu =menubar->addMenu("字体格式(&F)");
    fontmenu->addAction("设置" ,this ,SLOT(xzk_fontslot()) ,QKeySequence("Ctrl+F"));

}

void MainWindow::xzk_fontslot()
{
    bool ook;
    QFont font =QFontDialog::getFont(&ook, this->font(), this, "Font");
    if(ook)
        this->centralWidget()->setFont(font);
}

void MainWindow::xzk_newslot()
{
    if(_text->document()->isModified())
    {
        int sb=QMessageBox::warning(this, "是否保存", "是否保存"
                                    ,QMessageBox::Save, QMessageBox::No, QMessageBox::Cancel);
        switch (sb) {
        case QMessageBox::Save:
            if(_curPath.isEmpty())
            {
                if(xzk_saveAsslot())
                    break;
                xzk_saveAsslot();
            }
            else
                xzk_saveslot();
            break;
        case QMessageBox::No:
            _text->clear();
            _curPath.clear();
            break;
        default:
            break;
        }
    }
}

void MainWindow::xzk_openslot()
{
    QString filename =QFileDialog::getOpenFileName(this, "打开", "", "text(*.txt)");
    if(QFileInfo(filename).isFile())
    {
        _file->setFileName(filename);
        _file->open(QIODevice::ReadOnly);
        _text->setText(_file->readAll());
        _file->close();
    }
}

void MainWindow::xzk_saveslot()
{
    if(_curPath.isEmpty())
        xzk_saveAsslot();
    else
    {
        _file->open(QIODevice::WriteOnly|QIODevice::Truncate);
        _file->write(_text->toPlainText().toUtf8());
        _file->close();
    }
}

bool MainWindow::xzk_saveAsslot()
{
    QString filename =QFileDialog::getSaveFileName(this, "另存为", _curPath, "text(*.txt)");
    if(QFileInfo(filename).isNativePath())
    {
        _curPath=filename;
        _file->setFileName(filename);
        _file->open(QIODevice::WriteOnly|QIODevice::Truncate);
        _file->write(_text->toPlainText().toUtf8());
        _file->close();
    }
    return QFileInfo(filename).isNativePath();
}

void MainWindow::xzk_closeslot()
{
    this->close();
}

MainWindow::~MainWindow()
{

}

具体实现

1.创建一个菜单栏,把所有Action加上

void MainWindow::initMenu()
{
    QMenuBar* menubar =this->menuBar();   //创建菜单栏

    /*设置文件IO*/
    QMenu* filemenu =menubar->addMenu("文件(&F)");
    filemenu->addAction("新建" ,this ,SLOT(xzk_newslot()) ,QKeySequence("Ctrl+N"));
    filemenu->addAction("打开" ,this ,SLOT(xzk_openslot()) ,QKeySequence("Ctrl+O"));
    filemenu->addAction("保存" ,this ,SLOT(xzk_saveslot()) ,QKeySequence("Ctrl+S"));
    filemenu->addAction("另存为" ,this ,SLOT(xzk_saveAsslot()));
    filemenu->addAction("关闭" ,this ,SLOT(xzk_closeslot()) ,QKeySequence("Ctrl+Q"));

    /*设置换行格式*/
    QMenu* stylemenu =menubar->addMenu("是否换行(&s)");
    QAction* wrapAction = stylemenu->addAction("换行(w)"
                          ,[&](bool ischecked)
                          { ischecked ? _text->setWordWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere)
: _text->setWordWrapMode(QTextOption::NoWrap);});  //这里使用了lambada表达式
    wrapAction->setCheckable(true);
    wrapAction->setChecked(true);
    /*设置字体格式*/
    QMenu* fontmenu =menubar->addMenu("字体格式(&F)");
    fontmenu->addAction("设置" ,this ,SLOT(xzk_fontslot()) ,QKeySequence("Ctrl+F"));

}

2.把准备工作做好

在mainwidow.h加入以下成员变量

private:
    QFile* _file;    //用来保存文件名
    QTextEdit* _text;   //用来设置文本格式
    QString _curPath;   //用来设置保存文件的路径
在mainwindow.cpp中:
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
{
    _file = new QFile(this);    //用来保存文件
    _text =new QTextEdit(this);  //用来保存文本
    this->setCentralWidget(_text);
    initMenu();
}

3.具体功能的实现

新建文件:

void MainWindow::xzk_newslot()

打开文件

void MainWindow::xzk_openslot()

保存文件

void MainWindow::xzk_saveslot()

另存为

bool MainWindow::xzk_saveAsslot()

设置字体格式

bool MainWindow::xzk_saveAsslot()

设置换行格式在initMenu中已经实现

    /*设置换行格式*/
    QMenu* stylemenu =menubar->addMenu("是否换行(&s)");
    QAction* wrapAction = stylemenu->addAction("换行(w)"
                          ,[&](bool ischecked){
                                            ischecked ? _text->setWordWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere)
                                            : _text->setWordWrapMode(QTextOption::NoWrap);});
    wrapAction->setCheckable(true);
    wrapAction->setChecked(true);
运用Qt开发工具来实现一个记事本,用户图形界面操作,通过Qt提供的图形库来设计记事本的管理、应用基本窗口,主要实现打开、新建、保存、另存为、查找、居中、字体、颜色等功能设计,同时在软件内部实现对于这些功能的支持和实现。还有对用户剪切、复制、粘贴、等功能的支持 核心代码讲解 1、打开文件功能 void MainWindow::on_action_2_triggered() { QString filename = QFileDialog::getOpenFileName(this); loadFile(filename); } 打开文件on_action_2_triggered()通过转到槽实现首先定义一个Qstring类型的filename让它获取你文件名,其次寻找它的本地连接。 3、保存文件功能 void MainWindow::on_action_3_triggered() { if(isSaved){ saveFile(curFile); } else{ do_file_SaveAS(); } } 保存文件功能on_action_3_triggered()通过转到槽实现,先判断bool型的isSaved是否是正确的,如果错则保存当前文件,否则执行另存为。 5、关闭功能 void MainWindow::on_action_5_triggered() { if(close){ QMessageBox::information(this,"提示","文件尚未保存,关闭"); }else{ ui->textEdit->close(); } } 关闭功能on_action_5_triggered()先对文本进行判断是否是关闭的,如果是错弹出对话框提示消息文件尚未保存,关闭,否则对文档进行关闭 11、查找功能 //查找 void MainWindow::close_findhangshu() { ui->gridLayoutWidget->close(); } close_findhangshu()对查找对话框进行关闭函数。 void MainWindow::on_action_11_triggered() { QDialog *closefind=new QDialog(this); QDialog *findDlg=new QDialog(this); find_textLineEdit=new QLineEdit(findDlg); QPushButton *find_Bth=new QPushButton(tr("查找下一个"),findDlg); QPushButton *close_find=new QPushButton(tr("关闭"),closefind); ui->gridLayout->addWidget(find_textLineEdit); ui->gridLayout->addWidget(find_Bth); ui->gridLayout->addWidget(close_find); connect(find_Bth,SIGNAL(clicked()),this,SLOT(show_findText())); connect(close_find,SIGNAL(clicked()),this,SLOT(close_findhangshu())); } 查找功能on_action_11_triggered()函数通过转到槽实现下面部分:先定义两个QDialog类型 指针变量*closefind和*findDlg,对它们进行新创建空间, find_textLineEdit=new QLineEdit(findDlg);新建一个空间对QlineEdit它进行传参,将findDlg传入目的是查找在文档中对应的文字,QPushButton *find_Bth=new QPushButton(tr("查找下一个"),findDlg);QPushButton *close_find=new QPushButton(tr("关闭"),closefind);这两个代码作用相同定义两个Qpubutton当点击查找功能弹出对话框时在对话框中实现查找下一个和关闭connect(find_Bth,SIGNAL(clicked()),this,SLOT(show_findText()));connect(close_find,SIGNAL(clicked()),this,SLOT(close_findhangshu()));点击查找下一个按钮时对它进行连接,执行show_findText()函数中的查找操作,如果点击关闭执行上述所说的close_findhangshu()关闭对话框操作 void MainWindow:: show_findText() { QString findText=find_textLineEdit->text(); if(!ui->textEdit->find(findText,QTextDocument::FindBackward)) { QMessageBox::warning(this,tr("查找"),tr("找不到 %1").arg(findText)); } } show_findText()此函数先定义QString类型 findText值,对文本进行扫描,如果文本不能找到找到则提示找不到。 本人也只是一个学生,记得点赞哦!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值