1.mainwindow.h
- #ifndef MAINWINDOW_H
- #define MAINWINDOW_H
- #include <QMainWindow>
- #include <QLineEdit>
- #include <QLabel>
- namespace Ui {
- class MainWindow;
- }
- class MainWindow : public QMainWindow
- {
- Q_OBJECT
- public:
- explicit MainWindow(QWidget *parent = 0);
- ~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_C_2_triggered();
- void on_action_C_3_triggered();
- void on_action_F_triggered();
- void show_findText();
- void do_cursorChanged(); //获取光标位置信息
- private:
- Ui::MainWindow *ui;
- bool isSaved; //true表示文件已经保存,false表示文件尚未保存
- QString curFile; //保存当前文件的文件名
- QLineEdit *find_textLineEdit; //声明一个行编辑器,用于输入要查找的内容
- QLabel *first_statusLabel; //声明两个标签对象,用于显示状态信息
- QLabel *second_statusLabel;
- void init_statusBar(); //初始化状态栏
- void do_file_New(); //新建文件
- void do_file_SaveOrNot(); //修改过得文件是否保存
- void do_file_Save(); //保存文件
- void do_file_SaveAs(); //文件另存为
- bool saveFile(const QString &fileName); //存储文件
- void do_file_Open(); //打开文件
- bool do_file_Load(const QString& fileName); //读取文件
- };
- #endif // MAINWINDOW_H
2.mainwindow.cpp
- #include "mainwindow.h"
- #include "ui_mainwindow.h"
- #include <QtGui>
- #include <QMessageBox>
- #include <QFileDialog>
- #include <QPushButton>
- MainWindow::MainWindow(QWidget *parent) :
- QMainWindow(parent),
- ui(new Ui::MainWindow)
- {
- ui->setupUi(this);
- isSaved=false; //初始化为未保存过状态
- curFile=tr("noname.txt");
- setWindowTitle(curFile); //初始化主窗口标题
- init_statusBar();
- connect(ui->textEdit,SIGNAL(cursorPositionChanged()),this,SLOT(do_cursorChanged())); //光标改变关联函数
- }
- MainWindow::~MainWindow()
- {
- delete ui;
- }
- void MainWindow::do_file_New()
- {
- do_file_SaveOrNot(); //弹出是否保存文件对话框
- isSaved=false;
- curFile=tr("noname.txt");
- setWindowTitle(curFile);
- ui->textEdit->clear(); //清空文本编辑器
- ui->textEdit->setVisible(true); //文本编辑器可见
- }
- void MainWindow::do_file_SaveOrNot()
- {
- if(ui->textEdit->document()->isModified()) //如果文件被修改过
- {
- QMessageBox box;
- box.setWindowTitle(tr("Warning"));
- box.setIcon(QMessageBox::Warning);
- box.setText(curFile + tr("Saved?"));
- box.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
- if(box.exec()==QMessageBox::Yes)
- do_file_Save();
- }
- }
- void MainWindow::do_file_Save()
- {
- if(isSaved) //如果文件已经保存过,直接保存文件
- saveFile(curFile);
- else //如果文件是第一次保存,那么调用另存为
- do_file_SaveAs();
- }
- void MainWindow::do_file_SaveAs()
- {
- QString fileName = QFileDialog::getSaveFileName(this,tr("Save as"),curFile);
- if(!fileName.isEmpty()) //如果文件名不为空,则保存文件内容
- {
- saveFile(fileName);
- }
- }
- bool MainWindow::saveFile(const QString &fileName)
- {
- QFile file(fileName);
- if(!file.open(QFile::WriteOnly | QFile::Text))
- {
- QMessageBox::warning(this,tr("save file"),tr("cannot save file %1:\n %2")
- .arg(fileName).arg(file.errorString()));
- return false;
- }
- //%1,%2表示后面的两个arg参数的值
- QTextStream out(&file); //新建流对象,指向选定的文件
- out<<ui->textEdit->toPlainText(); //将文本编辑器里的内容以纯文本的形式输出到流对象中
- isSaved=true;
- curFile=QFileInfo(fileName).canonicalFilePath(); //获得文件的标准路径
- setWindowTitle(curFile); //将窗口名称改为现在窗口的路径
- second_statusLabel->setText(tr("Save file sucessfully."));
- return true;
- }
- void MainWindow::do_file_Open() //打开文件
- {
- do_file_SaveOrNot(); //如果现有文件没保存,弹出提示框
- QString fileName=QFileDialog::getOpenFileName(this); //获得要打开文件的名字
- if(!fileName.isEmpty())
- {
- do_file_Load(fileName);
- }
- ui->textEdit->setVisible(true); //文本编辑器可见
- }
- bool MainWindow::do_file_Load(const QString &fileName)
- {
- QFile file(fileName);
- if(!file.open(QFile::ReadOnly | QFile::Text))
- {
- QMessageBox::warning(this,tr("Read file"),tr("cannot read file %1: \n%2").arg(fileName)
- .arg(file.errorString()));
- return false;
- }
- QTextStream in(&file);
- ui->textEdit->setText(in.readAll()); //将文件中的内容都写到文本编辑器中
- curFile=QFileInfo(fileName).canonicalFilePath();
- setWindowTitle(curFile);
- second_statusLabel->setText(tr("Open file sucessfully."));
- return true;
- }
- void MainWindow::on_action_N_triggered()
- {
- do_file_New();
- }
- void MainWindow::on_action_S_triggered()
- {
- do_file_Save();
- }
- void MainWindow::on_action_A_triggered()
- {
- do_file_SaveAs();
- }
- void MainWindow::on_action_O_triggered()
- {
- do_file_Open();
- }
- void MainWindow::on_action_C_triggered()
- {
- do_file_SaveOrNot();
- ui->textEdit->setVisible(false);
- first_statusLabel->setText(tr("Text editor has been closed."));
- second_statusLabel->setText(tr("Made by tjc."));
- }
- void MainWindow::on_action_X_triggered()
- {
- on_action_C_triggered(); //先执行关闭操作
- qApp->quit(); //再退出系统,qApp是指向应用程序的全局指针
- }
- void MainWindow::on_action_Z_triggered()
- {
- ui->textEdit->undo();
- }
- void MainWindow::on_action_C_2_triggered()
- {
- ui->textEdit->cut();
- }
- void MainWindow::on_action_C_3_triggered()
- {
- ui->textEdit->copy();
- }
- void MainWindow::on_action_F_triggered()
- {
- QDialog *findDlg=new QDialog(this); //新建一个对话框,用于查找操作,this表明他的父窗口是MainWindow
- findDlg->setWindowTitle(tr("Find"));
- find_textLineEdit=new QLineEdit(findDlg); //将行编辑器加入到新建的查找对话框中
- QPushButton *find_Btn=new QPushButton(tr("Find Next"),findDlg); //加入“查找下一个”按钮
- QVBoxLayout *layout=new QVBoxLayout(findDlg); //新建一个垂直布局管理器
- layout->addWidget(find_textLineEdit); //将行编辑器加入其中
- layout->addWidget(find_Btn); //将按钮加入其中
- findDlg->show();
- connect(find_Btn,SIGNAL(clicked()),this,SLOT(show_findText())); //设置“查找下一个”按钮的单击事件和其槽函数的关联
- second_statusLabel->setText(tr("Finding."));
- }
- void MainWindow::show_findText()
- {
- QString findText=find_textLineEdit->text(); //获取行编辑器中的内容
- if(!ui->textEdit->find(findText,QTextDocument::FindBackward))
- {
- QMessageBox::warning(this,tr("find"),tr("cannot find %1").arg(findText));
- }
- }
- void MainWindow::init_statusBar()
- {
- QStatusBar *bar=ui->statusBar; //获取状态栏
- first_statusLabel=new QLabel; //新建标签
- first_statusLabel->setMinimumSize(150,20); //设置标签最小尺寸
- first_statusLabel->setFrameShape(QFrame::WinPanel); //设置标签形状
- first_statusLabel->setFrameShadow(QFrame::Sunken); //设置标签阴影
- second_statusLabel=new QLabel;
- second_statusLabel->setMinimumSize(150,20);
- second_statusLabel->setFrameShape(QFrame::WinPanel);
- second_statusLabel->setFrameShadow(QFrame::Sunken);
- bar->addWidget(first_statusLabel);
- bar->addWidget(second_statusLabel);
- first_statusLabel->setText(tr("Welcome to use text editor."));
- second_statusLabel->setText(tr("Made by tjc."));
- }
- void MainWindow::do_cursorChanged()
- {
- int rowNum=ui->textEdit->document()->blockCount(); //获取光标所在行
- const QTextCursor cursor=ui->textEdit->textCursor();
- int colNum=cursor.columnNumber(); //获取光标所在的列号
- first_statusLabel->setText(tr("%1 line %2 column").arg(rowNum).arg(colNum));
- }
3.main.cpp
- #include "mainwindow.h"
- #include <QApplication>
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- MainWindow w;
- w.show();
- return a.exec();
- }
4.界面展示
5.运行效果