Qt选项卡窗口实现查找替换

查找与替换是存在共同之处的功能,可以将他们放在一个选项卡窗口下

findtext设计replaceSignal信号

1
2
3
signals:
// 第一个参数为要查找的,第二个为替换目标
void replaceSignal(const QString &, const QString &);

findText.cpp发送信号

1
2
3
4
5
6
7
void findText::emitReplaceSignal(){
QString string = ui->lineEdit_2->text();
QString replaceStr = ui->lineEdit_3->text();
if(!string.isEmpty() && !replaceStr.isEmpty()){
emit replaceSignal(string, replaceStr);
}
}

主窗口设计接受信号槽

MainWindow.h声明接受信号槽

1
2
private slots:
void StartReplace(const QString&, const QString&);

MainWindow.cpp内以FindDlg(int choice)处理查找替换两种功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 打开查找对话框
void MainWindow::Find(bool){
FindDlg(0);
}
void MainWindow::Find_Replace(bool){
FindDlg(1);
}
void MainWindow::FindDlg(int choice){
findtext = new findText(this, choice);
// 接受来自findtext发过来的信号serachsignal,replaceSignal
connect(findtext, SIGNAL(searchSignal(const QString&, bool, bool, bool)),
this, SLOT(StartSearch(const QString&, bool, bool, bool)));
connect(findtext, SIGNAL(replaceSignal(const QString&, const QString&)),
this,SLOT(StartReplace(const QString&, const QString&)));
activeEditor()->moveCursor(QTextCursor::Start);
findtext->show();
}

findtext.cpp构造函数内进行选项卡的对应

1
2
3
4
5
if(choice == 0){ //Find
ui->tabWidget->setCurrentIndex(0);
}else if(choice == 1){ //Find&Replace
ui->tabWidget->setCurrentIndex(1);
}

开始替换

1
2
3
4
5
6
7
8
9
10
void MainWindow::StartReplace(const QString &data, const QString &replaceStr){
if(!activeEditor()){
return;
}
QTextCursor cursor = activeEditor()->textCursor();
if(cursor.hasSelection() && cursor.selectedText() == data){
cursor.removeSelectedText();
cursor.insertText(replaceStr);
}
}