如何实现非模态查找对话框与主窗口的通信来达到查找的目的
主窗口设计接受信号槽
在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); } }
|