QT制作的文本编辑器——加强版(可以针对多个文件进行编辑)
上一篇文章是文本编辑器基础版,没有同时打开、编辑多个文本文件的功能。上一篇文章:https://editor.youkuaiyun.com/md/?articleId=108162179
一、控件介绍
程序主窗口是QT中的QMainWindow,可以设计菜单栏、工具栏、状态栏等。

文本编辑区是TextEdit控件放置在TabWidget控件中,然后将TabWidget设置为中央窗口,纯代码设计界面,自适应性强。状态栏界面是三个QLabel控件,第一个为当前文件路径与文件名,第二个为显示当前编码方式,第三个则显示当前文件是否有改动,如果未改动,则显示空白,若有改动,则显示*。
二、多文件编辑与单文件编辑的差别
多文件编辑会引出一个问题,就是当前的TextEdit究竟是哪一个?由于在函数内部新建指针指向TextEdit后,函数结束指针就会被释放,那么怎么来定位当前的TextEdit就成了一个问题。这里可以使用一个指针数组来保存这些指针,每次编辑或进行其他操作时,先利用QTabWidget中的currentIndex()方法来获取当前页面的下标,然后用这个下标访问指针数组对应位置的指针,即可操作对应页面的文本编辑框。这里就会有一个新问题,就是单个文件编辑时关闭文件只需判断文件是否改动然后询问是否保存即可,多个文件编辑时关闭文件则需要考虑指针数组中的指针。首先需要将该指针从指针数组中移除,然后再关闭当前tab。
QTextEdit *TE[64];//存储TextEdit指针
QTextEdit *te = new QTextEdit; //新建一个QTextEdit
TE[file_count]=te; //将当前TextEdit指针加入指针数组
file_count++; //文件总数+1
关闭文件的时候,则需要将指针移除
file_count_now = tab->currentIndex();
filenames.removeAt(file_count_now);//移除filenames表中的当前文件名
tab->removeTab(file_count_now);//移除当前tab
for(int i=file_count_now;i<63;i++)//从当前文件开始,指针前移
{
TE[i]=TE[i+1];
}
file_count--; //文件总数减少
其他功能与之类似,也是获取当前页数,通过指针数组中的指针来对文本进行编辑。
三、查找功能

这里查找功能会打开一个新的界面,是QDialog类型的界面,当点击查找界面的search按键时,向主窗口发送一个信号,主窗口收到信号后,进入槽函数进行后续操作,此处需要用到emit发送信号。
void MainWindow::edit_search()//查找函数
{
finddialog = new Dialog; //新建窗口对象
finddialog->show(); //显示窗口对象
connect(finddialog,SIGNAL(searchSignal(const QString)),this,SLOT(search(const QString)));//接收窗口对象发来的信号与字符串
}
void MainWindow::search(const QString &str)
{
file_count_now = tab->currentIndex();
TE[file_count_now]->find(str,QTextDocument::FindBackward);//向前查找
/* 高亮显示查找到的内容 */
QPalette pale = TE[file_count_now]->palette();
pale.setColor(QPalette::Highlight,pale.color(QPalette::Active,QPalette::Highlight));
TE[file_count_now]->setPalette(pale);
}
QPushButton *bt = new QPushButton("Search");
connect(bt,SIGNAL(clicked(bool)),this,SLOT(emitsearchsignal()));
void Dialog::emitsearchsignal()
{
QString str = le->text();
if(!str.isEmpty())
{
emit searchSignal(str);
}
}
槽函数也需要在头文件中的public slots中进行声明

166

被折叠的 条评论
为什么被折叠?



