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();}
阅读全文
0 0
- Qt5--文本编辑器 (二)
- Qt5--文本编辑器
- vi文本编辑器(二)
- Qt5主窗体程序: 文本编辑器的实现(Qt5开发及实例)
- Qt5主窗体程序: 文本编辑器的实现(Qt5开发及实例)
- 文本编辑器vi的使用(二)
- Vim文本编辑器 指令大全(二)
- Android富文本编辑器总结(二)
- 【Qt5开发及实例】16、实现一个简单的文本编辑器(over)
- 文本编辑器<二>滚动条
- Qt5 text_Editor(二)
- 关于富文本编辑器summernote的基本使用(二)
- draft.js--富文本编辑器框架的实践(二)
- Qt5与QML(二)
- Qt5串口通信(二)
- 文本编辑器Scite源代码阅读过程(二)
- 前端入门-富文本编辑器(二)
- 【Qt5开发及实例】12、实现一个简单的文本编辑器1
- 组合数求模模板
- CountVectorizer、TfidfTransformer、TfidfVectorizer关系
- 【React】配置react-hot-loader后出现import' and 'export' may only appear at the top level
- Effective C++笔记
- 521356
- Qt5--文本编辑器 (二)
- node核心模块之path
- iOS导航栏创建
- Django Model
- 各种正则:邮箱,电话号码,身份证号。
- mac版本idea使用(四)
- Android编程权威指南(第2版)—第2章挑战练习
- H5 video标签在移动端,不默认全屏播放。
- vue开发——如可操作文档元素