Qt5--文本编辑器 (二)

来源:互联网 发布:奶茶网络营销策划书 编辑:程序博客网 时间:2024/05/21 09:51
  • 添加了状态栏显示的两种三种方式
  • 添加了文本查找
    mainwindow.h
#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <QCloseEvent>//类的前置声明class QLineEdit;class QDialog;class QLabel;namespace Ui {class MainWindow;}class MainWindow : public QMainWindow{    Q_OBJECTpublic:    explicit MainWindow(QWidget *parent = 0);    void newFile(); //新建操作    bool maybeSave(); //判断是否需要保存    bool save();  //保存操作    bool saveAs();  //另存为    bool saveFile(const QString &fileName); //保存文件    bool loadFile(const QString &fileName);//加载文件    ~MainWindow();private slots:    void on_action_N_triggered();    void on_action_S_triggered();    void on_action_A_triggered();    void on_action_O_triggered();    void on_action_C_triggered();    void on_action_X_triggered();    void on_action_Z_triggered();    void on_action_X_2_triggered();    void on_action_C_2_triggered();    void on_action_V_triggered();    void showFindText();    void on_action_F_triggered();private:    Ui::MainWindow *ui;    bool isUntitled;  // 为真表示文件没有保存过,为假表示文件已经被保存过了    QString curFile;  // 保存当前文件的路径    QLineEdit *findLineEdit;    QDialog *findDlg;    QLabel *statusLabel;protected:    void closeEvent(QCloseEvent *event); // 关闭事件};#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 "ui_mainwindow.h"#include <QString>#include <QMessageBox>#include <QPushButton>#include <QFileDialog>#include <QTextStream>#include <QDialog>#include <QLineEdit>#include <QLabel>MainWindow::MainWindow(QWidget *parent) :    QMainWindow(parent),    ui(new Ui::MainWindow){    ui->setupUi(this);    // 初始化文件为未保存状态    isUntitled = true;    // 初始化文件名为"未命名.txt"    curFile = tr(u8"未命名.txt");    //创建一个对话框,将一个行编辑器和一个按钮放到了上面    findDlg = new QDialog(this);    findDlg->setWindowTitle(tr(u8"查找"));    findLineEdit = new QLineEdit(findDlg);    QPushButton *btn= new QPushButton(tr(u8"查找下一个"), findDlg);    QVBoxLayout *layout= new QVBoxLayout(findDlg);    layout->addWidget(findLineEdit);    layout->addWidget(btn);    //按钮的单击信号关联到了自定义的显示查找结果槽上    connect(btn, &QPushButton::clicked, this, &MainWindow::showFindText);    // 初始化窗口标题为文件名    setWindowTitle(curFile);    //只能显示一次    //ui->statusBar->showMessage(tr(u8"欢迎使用liefyuan的软件!"), 1000);    //可以通过设置statusLabel->setText()来在其他地方设置不同的文本    statusLabel = new QLabel;    statusLabel->setMinimumSize(150, 20); // 设置标签最小大小    statusLabel->setFrameShape(QFrame::WinPanel); // 设置标签形状    statusLabel->setFrameShadow(QFrame::Sunken); // 设置标签阴影    ui->statusBar->addWidget(statusLabel);    statusLabel->setText(tr(u8"欢迎使用liefyuan的软件!"));    //在右边设置永久信息的网站链接    QLabel *permanent = new QLabel;    permanent->setFrameStyle(QFrame::Box | QFrame::Sunken);    permanent->setText(tr("<a href=\"http://www.liefyuan.com\">liefyuan.com</a>"));    permanent->setTextFormat(Qt::RichText);    permanent->setOpenExternalLinks(true);    ui->statusBar->addPermanentWidget(permanent);}MainWindow::~MainWindow(){    delete ui;}/** * @brief MainWindow::newFile * 功能:新建文件夹操作函数 * 功能:使用maybeSave()来判断文档是否需要保存,如果已经保存完了,则新建文档,并进行初始化 */void MainWindow::newFile(){    if (maybeSave()) {        isUntitled = true;        curFile = tr(u8"未命名.txt");        setWindowTitle(curFile);        ui->textEdit->clear();        ui->textEdit->setVisible(true);    }}/** * @brief MainWindow::maybeSave * @return * 功能:使用了isModified()来判断文档是否被更改了,如果被更改了, * 则弹出对话框让用户选择是否进行保存,或者取消操作。如果取消操作,那么就返回false,什么都不执行 */bool MainWindow::maybeSave(){    //如果文档被更改了    if (ui->textEdit->document()->isModified()) {        // 自定义一个警告对话框        QMessageBox box;        box.setWindowTitle(tr(u8"警告"));        box.setIcon(QMessageBox::Warning);        box.setText(curFile + tr(u8"尚未保存,是否保存?"));        QPushButton *yesBtn = box.addButton(tr(u8"是(&Y)"),                                            QMessageBox::YesRole);        box.addButton(tr(u8"否(&N)"), QMessageBox::NoRole);        QPushButton *cancelBtn = box.addButton(tr(u8"取消"),                                               QMessageBox::RejectRole);        box.exec();        if (box.clickedButton() == yesBtn)            return save();        else if (box.clickedButton() == cancelBtn)            return false;    }    //如果文档没有被更改,则直接返回true    return true;}/** * @brief MainWindow::save * @return * * 如果文档以前没有保存过,那么执行另存为操作saveAs(), * 如果已经保存过,那么调用saveFile()执行文件保存操作 */bool MainWindow::save(){    if (isUntitled) {        return saveAs();    }    else {        return saveFile(curFile);    }}/** * @brief MainWindow::saveAs * @return * 功能:使用QFileDialog来实现了一个另存为对话框,并且获取了文件的路径, * 然后使用文件路径来保存文件 * */bool MainWindow::saveAs() {    QString fileName = QFileDialog::getSaveFileName(this,                                                    tr(u8"另存为"),                                                    curFile);    if (fileName.isEmpty()) return false;    return saveFile(fileName);}/** * @brief MainWindow::saveFile * @param fileName * @return * 功能:函数执行真正的文件保存操作。先是使用一个QFile类对象来指向要保存的文件, * 然后使用文本写入方式将其打开。 * 打开后再使用QTextStream文本流将编辑器中的内容写入到文件中 */bool MainWindow::saveFile(const QString &fileName){    QFile file(fileName);    if (!file.open(QFile::WriteOnly | QFile::Text)) {        // %1和%2分别对应后面arg两个参数,/n器换行的作用        QMessageBox::warning(this, tr(u8"多文档编辑器"),                             tr(u8"无法写入文件 %1: /n %2")                             .arg(fileName).arg(file.errorString()));        return false;    }    QTextStream out(&file);    // 鼠标指针变为等待状态    QApplication::setOverrideCursor(Qt::WaitCursor);    out << ui->textEdit->toPlainText();    // 鼠标指针恢复原来的状态    QApplication::restoreOverrideCursor();    isUntitled = false;    // 获得文件的标准路径    curFile = QFileInfo(fileName).canonicalFilePath();    setWindowTitle(curFile);    return true;}bool MainWindow::loadFile(const QString &fileName){    QFile file(fileName); // 新建QFile对象    if (!file.open(QFile::ReadOnly | QFile::Text)) {        QMessageBox::warning(this,tr(u8"多文档编辑器"),                             tr(u8"无法读取文件 %1 : /n%2.")                             .arg(fileName).arg(file.errorString()));        return false; // 只读方式打开文件,出错则提示,并返回false    }    QTextStream in(&file); //新建文本流对象    QApplication::setOverrideCursor(Qt::WaitCursor);    // 读取文件的全部文本内容,并添加到编辑器中    ui->textEdit->setPlainText(in.readAll());    QApplication::restoreOverrideCursor();    // 设置当前文件    curFile = QFileInfo(fileName).canonicalFilePath();    setWindowTitle(curFile);    return true;}void MainWindow::closeEvent(QCloseEvent *event) {    // 如果maybeSave()函数返回true,则关闭程序    if (maybeSave()) {        event->accept();    }    else {        event->ignore();    }}/** * @brief MainWindow::on_action_N_triggered * 功能:新建文件 * */void MainWindow::on_action_N_triggered(){    newFile();}/** * @brief MainWindow::on_action_S_triggered * 功能:保存文件 * */void MainWindow::on_action_S_triggered(){    save();}/** * @brief MainWindow::on_action_A_triggered *  功能:另存文件 */void MainWindow::on_action_A_triggered(){    saveAs();}/** * @brief MainWindow::on_action_O_triggered * 功能:打开文件 */void MainWindow::on_action_O_triggered(){    if (maybeSave()) {        QString fileName = QFileDialog::getOpenFileName(this);        // 如果文件名不为空,则加载文件        if (!fileName.isEmpty()) {            loadFile(fileName);            ui->textEdit->setVisible(true);        }    }}/** * @brief MainWindow::on_action_C_triggered * 功能:关闭文件 */void MainWindow::on_action_C_triggered(){    if (maybeSave()) {        ui->textEdit->setVisible(false);    }}/** * @brief MainWindow::on_action_X_triggered * 功能:退出软件 */void MainWindow::on_action_X_triggered(){    // 先执行关闭操作,再退出程序    // qApp是指向应用程序的全局指针    on_action_C_triggered();    qApp->quit();}/** * @brief MainWindow::on_action_Z_triggered * 功能:撤销操作 */void MainWindow::on_action_Z_triggered(){    ui->textEdit->undo();}/** * @brief MainWindow::on_action_X_2_triggered * 功能:剪切操作 */void MainWindow::on_action_X_2_triggered(){    ui->textEdit->cut();}/** * @brief MainWindow::on_action_C_2_triggered * 功能:复制操作 */void MainWindow::on_action_C_2_triggered(){    ui->textEdit->copy();}/** * @brief MainWindow::on_action_V_triggered * 功能:粘贴操作 */void MainWindow::on_action_V_triggered(){    ui->textEdit->paste();}void MainWindow::showFindText(){    //获取行编辑器中要查找的字符串    QString str = findLineEdit->text();    if (!ui->textEdit->find(str, QTextDocument::FindBackward)) {        QMessageBox::warning(this,tr(u8"查找"), tr(u8"找不到%1").arg(str));//%1作为占位符,在显示时会被arg()中的参数替换掉,这是一种常用的在字符串中添加变量值的方式    }}/** * @brief MainWindow::on_action_F_triggered * 功能:查找文本编辑器里面的文本 */void MainWindow::on_action_F_triggered(){     findDlg->show();     statusLabel->clear();}

这里写图片描述

这里写图片描述

原创粉丝点击