非模态查找对话框与主窗口的通信

如何实现非模态查找对话框与主窗口的通信来达到查找的目的

主窗口设计接受信号槽

MainWindow.h声明接受信号槽

1
2
private slots:
void StartSearch(const QString &data, bool cs, bool forward);

MainWindow.cpp主窗口函数内以非模态运行对话框

1
2
3
4
5
6
7
8
9
10
11
12
void MainWindow::Find(bool){
findtext = new findText(this);
// this窗口的StartSearch函数接受来自findtext发过来的信号serachsignal的参数
// serachsignal内的参数实现了两个窗口间的通信
connect(findtext, SIGNAL(searchSignal(const QString&, bool, bool)),
this, SLOT(StartSearch(const QString&, bool, bool)));
// 当前活动窗口(QTextEdit)鼠标指针置于起始位置
activeEditor()->moveCursor(QTextCursor::Start);
// 没有设置Qt::WindowModality属性值则show()-非模态,
// open()-半模态,exec()-模态,阻塞父窗口
findtext->show();
}

接受信号槽函数设计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void MainWindow::StartSearch(const QString &data, bool cs, bool forward){
if(!activeEditor()){
return;
}
bool isfind;
// cs为真,匹配大小写
if(cs){
// 如果forward为真,向前查找
if(forward){
isfind = activeEditor()->find(data,QTextDocument::FindCaseSensitively);
}else{
isfind = activeEditor()->find(data, QTextDocument::FindBackward | QTextDocument::FindCaseSensitively);
}
}else {
if(forward){
isfind = activeEditor()->find(data);
}else{
isfind = activeEditor()->find(data,QTextDocument::FindBackward);
}
}
if(isfind){
// 查找到后高亮显示
QPalette palette= activeEditor()->palette();
palette.setColor(QPalette::Highlight,palette.color(QPalette::Active,QPalette::Highlight));
activeEditor()->setPalette(palette);
}
}

findtext设计searchSignal信号

findText.h声明信号:

1
2
signals:
void searchSignal(const QString &, bool, bool);

findText.cpp发送信号

1
2
3
4
5
6
7
8
9
10
11
void findText::emitSearchSignal()
{
QString string = ui->lineEdit->text();
// cs->匹配大小写,fw向前查找
bool cs = ui->checkBox->isChecked()?true:false;
bool fw = ui->checkBox_2->isChecked()?true:false;
if(!string.isEmpty()){
// 发送信号
emit searchSignal(string, cs, fw);
}
}