QT之文本编辑器实现

该博客详细介绍了如何使用QT框架实现一个简单的文本编辑器。内容包括:定义mainwindow类,实现文件的新建、保存、打开、关闭、查找等功能,以及光标位置的获取。此外,还涉及到文件读写、对话框交互和状态栏信息更新等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.mainwindow.h

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #ifndef MAINWINDOW_H  
  2. #define MAINWINDOW_H  
  3.   
  4. #include <QMainWindow>  
  5. #include <QLineEdit>  
  6. #include <QLabel>  
  7.   
  8. namespace Ui {  
  9. class MainWindow;  
  10. }  
  11.   
  12. class MainWindow : public QMainWindow  
  13. {  
  14.     Q_OBJECT  
  15.   
  16. public:  
  17.     explicit MainWindow(QWidget *parent = 0);  
  18.     ~MainWindow();  
  19.   
  20. private slots:  
  21.     void on_action_N_triggered();  
  22.   
  23.     void on_action_S_triggered();  
  24.   
  25.     void on_action_A_triggered();  
  26.   
  27.     void on_action_O_triggered();  
  28.   
  29.     void on_action_C_triggered();  
  30.   
  31.     void on_action_X_triggered();  
  32.   
  33.     void on_action_Z_triggered();  
  34.   
  35.     void on_action_C_2_triggered();  
  36.   
  37.     void on_action_C_3_triggered();  
  38.   
  39.     void on_action_F_triggered();  
  40.   
  41.     void show_findText();  
  42.   
  43.     void do_cursorChanged();     //获取光标位置信息  
  44.   
  45. private:  
  46.     Ui::MainWindow *ui;  
  47.     bool isSaved;            //true表示文件已经保存,false表示文件尚未保存  
  48.     QString curFile;         //保存当前文件的文件名  
  49.     QLineEdit *find_textLineEdit;    //声明一个行编辑器,用于输入要查找的内容  
  50.     QLabel *first_statusLabel;       //声明两个标签对象,用于显示状态信息  
  51.     QLabel *second_statusLabel;  
  52.   
  53.   
  54.     void init_statusBar();           //初始化状态栏  
  55.     void do_file_New();        //新建文件  
  56.     void do_file_SaveOrNot();  //修改过得文件是否保存  
  57.     void do_file_Save();       //保存文件  
  58.     void do_file_SaveAs();     //文件另存为  
  59.     bool saveFile(const QString &fileName);    //存储文件  
  60.   
  61.     void do_file_Open();       //打开文件  
  62.     bool do_file_Load(const QString& fileName);  //读取文件  
  63. };  
  64.   
  65. #endif // MAINWINDOW_H  


2.mainwindow.cpp

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include "mainwindow.h"  
  2. #include "ui_mainwindow.h"  
  3. #include <QtGui>  
  4. #include <QMessageBox>  
  5. #include <QFileDialog>  
  6. #include <QPushButton>  
  7.   
  8. MainWindow::MainWindow(QWidget *parent) :  
  9.     QMainWindow(parent),  
  10.     ui(new Ui::MainWindow)  
  11. {  
  12.     ui->setupUi(this);  
  13.     isSaved=false;     //初始化为未保存过状态  
  14.     curFile=tr("noname.txt");  
  15.     setWindowTitle(curFile);   //初始化主窗口标题  
  16.     init_statusBar();  
  17.     connect(ui->textEdit,SIGNAL(cursorPositionChanged()),this,SLOT(do_cursorChanged())); //光标改变关联函数  
  18. }  
  19.   
  20. MainWindow::~MainWindow()  
  21. {  
  22.     delete ui;  
  23. }  
  24.   
  25.   
  26. void MainWindow::do_file_New()  
  27. {  
  28.     do_file_SaveOrNot();  //弹出是否保存文件对话框  
  29.     isSaved=false;  
  30.     curFile=tr("noname.txt");  
  31.     setWindowTitle(curFile);  
  32.     ui->textEdit->clear();   //清空文本编辑器  
  33.     ui->textEdit->setVisible(true);    //文本编辑器可见  
  34. }  
  35.   
  36.   
  37. void MainWindow::do_file_SaveOrNot()  
  38. {  
  39.     if(ui->textEdit->document()->isModified())  //如果文件被修改过  
  40.     {  
  41.         QMessageBox box;  
  42.         box.setWindowTitle(tr("Warning"));  
  43.         box.setIcon(QMessageBox::Warning);  
  44.         box.setText(curFile + tr("Saved?"));  
  45.         box.setStandardButtons(QMessageBox::Yes | QMessageBox::No);  
  46.         if(box.exec()==QMessageBox::Yes)  
  47.             do_file_Save();  
  48.     }  
  49. }  
  50.   
  51. void MainWindow::do_file_Save()  
  52. {  
  53.     if(isSaved)    //如果文件已经保存过,直接保存文件  
  54.         saveFile(curFile);  
  55.     else           //如果文件是第一次保存,那么调用另存为  
  56.         do_file_SaveAs();  
  57. }  
  58.   
  59.   
  60. void MainWindow::do_file_SaveAs()  
  61. {  
  62.     QString fileName = QFileDialog::getSaveFileName(this,tr("Save as"),curFile);  
  63.     if(!fileName.isEmpty())  //如果文件名不为空,则保存文件内容  
  64.     {  
  65.         saveFile(fileName);  
  66.     }  
  67. }  
  68.   
  69.   
  70. bool MainWindow::saveFile(const QString &fileName)  
  71. {  
  72.     QFile file(fileName);  
  73.     if(!file.open(QFile::WriteOnly | QFile::Text))  
  74.     {  
  75.         QMessageBox::warning(this,tr("save file"),tr("cannot save file %1:\n %2")  
  76.                              .arg(fileName).arg(file.errorString()));  
  77.         return false;  
  78.     }  
  79.     //%1,%2表示后面的两个arg参数的值  
  80.     QTextStream out(&file);  //新建流对象,指向选定的文件  
  81.     out<<ui->textEdit->toPlainText();    //将文本编辑器里的内容以纯文本的形式输出到流对象中  
  82.     isSaved=true;  
  83.     curFile=QFileInfo(fileName).canonicalFilePath();   //获得文件的标准路径  
  84.     setWindowTitle(curFile);   //将窗口名称改为现在窗口的路径  
  85.     second_statusLabel->setText(tr("Save file sucessfully."));  
  86.     return true;  
  87. }  
  88.   
  89. void MainWindow::do_file_Open()  //打开文件  
  90. {  
  91.     do_file_SaveOrNot();    //如果现有文件没保存,弹出提示框  
  92.     QString fileName=QFileDialog::getOpenFileName(this);   //获得要打开文件的名字  
  93.     if(!fileName.isEmpty())  
  94.     {  
  95.         do_file_Load(fileName);  
  96.     }  
  97.     ui->textEdit->setVisible(true);   //文本编辑器可见  
  98. }  
  99.   
  100. bool MainWindow::do_file_Load(const QString &fileName)  
  101. {  
  102.     QFile file(fileName);  
  103.     if(!file.open(QFile::ReadOnly | QFile::Text))  
  104.     {  
  105.         QMessageBox::warning(this,tr("Read file"),tr("cannot read file %1: \n%2").arg(fileName)  
  106.                              .arg(file.errorString()));  
  107.         return false;  
  108.     }  
  109.     QTextStream in(&file);  
  110.     ui->textEdit->setText(in.readAll());  //将文件中的内容都写到文本编辑器中  
  111.     curFile=QFileInfo(fileName).canonicalFilePath();  
  112.     setWindowTitle(curFile);  
  113.     second_statusLabel->setText(tr("Open file sucessfully."));  
  114.     return true;  
  115. }  
  116.   
  117. void MainWindow::on_action_N_triggered()  
  118. {  
  119.     do_file_New();  
  120. }  
  121.   
  122. void MainWindow::on_action_S_triggered()  
  123. {  
  124.     do_file_Save();  
  125. }  
  126.   
  127. void MainWindow::on_action_A_triggered()  
  128. {  
  129.     do_file_SaveAs();  
  130. }  
  131.   
  132. void MainWindow::on_action_O_triggered()  
  133. {  
  134.     do_file_Open();  
  135. }  
  136.   
  137. void MainWindow::on_action_C_triggered()  
  138. {  
  139.     do_file_SaveOrNot();  
  140.     ui->textEdit->setVisible(false);  
  141.     first_statusLabel->setText(tr("Text editor has been closed."));  
  142.     second_statusLabel->setText(tr("Made by tjc."));  
  143. }  
  144.   
  145. void MainWindow::on_action_X_triggered()  
  146. {  
  147.     on_action_C_triggered();  //先执行关闭操作  
  148.     qApp->quit();             //再退出系统,qApp是指向应用程序的全局指针  
  149. }  
  150.   
  151. void MainWindow::on_action_Z_triggered()  
  152. {  
  153.     ui->textEdit->undo();  
  154. }  
  155.   
  156. void MainWindow::on_action_C_2_triggered()  
  157. {  
  158.     ui->textEdit->cut();  
  159. }  
  160.   
  161. void MainWindow::on_action_C_3_triggered()  
  162. {  
  163.     ui->textEdit->copy();  
  164. }  
  165.   
  166. void MainWindow::on_action_F_triggered()  
  167. {  
  168.     QDialog *findDlg=new QDialog(this);  //新建一个对话框,用于查找操作,this表明他的父窗口是MainWindow  
  169.     findDlg->setWindowTitle(tr("Find"));  
  170.     find_textLineEdit=new QLineEdit(findDlg);  //将行编辑器加入到新建的查找对话框中  
  171.     QPushButton *find_Btn=new QPushButton(tr("Find Next"),findDlg);   //加入“查找下一个”按钮  
  172.     QVBoxLayout *layout=new QVBoxLayout(findDlg);   //新建一个垂直布局管理器  
  173.     layout->addWidget(find_textLineEdit);           //将行编辑器加入其中  
  174.     layout->addWidget(find_Btn);                    //将按钮加入其中  
  175.     findDlg->show();  
  176.     connect(find_Btn,SIGNAL(clicked()),this,SLOT(show_findText()));  //设置“查找下一个”按钮的单击事件和其槽函数的关联  
  177.     second_statusLabel->setText(tr("Finding."));  
  178. }  
  179.   
  180.   
  181. void MainWindow::show_findText()  
  182. {  
  183.     QString findText=find_textLineEdit->text();     //获取行编辑器中的内容  
  184.     if(!ui->textEdit->find(findText,QTextDocument::FindBackward))  
  185.     {  
  186.         QMessageBox::warning(this,tr("find"),tr("cannot find %1").arg(findText));  
  187.     }  
  188. }  
  189.   
  190. void MainWindow::init_statusBar()  
  191. {  
  192.     QStatusBar *bar=ui->statusBar;     //获取状态栏  
  193.     first_statusLabel=new QLabel;      //新建标签  
  194.     first_statusLabel->setMinimumSize(150,20); //设置标签最小尺寸  
  195.     first_statusLabel->setFrameShape(QFrame::WinPanel);   //设置标签形状  
  196.     first_statusLabel->setFrameShadow(QFrame::Sunken);    //设置标签阴影  
  197.     second_statusLabel=new QLabel;  
  198.     second_statusLabel->setMinimumSize(150,20);  
  199.     second_statusLabel->setFrameShape(QFrame::WinPanel);  
  200.     second_statusLabel->setFrameShadow(QFrame::Sunken);  
  201.     bar->addWidget(first_statusLabel);  
  202.     bar->addWidget(second_statusLabel);  
  203.     first_statusLabel->setText(tr("Welcome to use text editor."));  
  204.     second_statusLabel->setText(tr("Made by tjc."));  
  205. }  
  206.   
  207.   
  208. void MainWindow::do_cursorChanged()  
  209. {  
  210.     int rowNum=ui->textEdit->document()->blockCount();     //获取光标所在行  
  211.     const QTextCursor cursor=ui->textEdit->textCursor();  
  212.     int colNum=cursor.columnNumber();               //获取光标所在的列号  
  213.     first_statusLabel->setText(tr("%1 line %2 column").arg(rowNum).arg(colNum));  
  214. }  


3.main.cpp

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. #include "mainwindow.h"  
  2. #include <QApplication>  
  3.   
  4. int main(int argc, char *argv[])  
  5. {  
  6.     QApplication a(argc, argv);  
  7.     MainWindow w;  
  8.     w.show();  
  9.   
  10.     return a.exec();  
  11. }  


4.界面展示





5.运行效果


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值