文本编辑器中查找对话框及功能实现
生活随笔
收集整理的這篇文章主要介紹了
文本编辑器中查找对话框及功能实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 1 查找對話框界面實現
- 2 查找對話框的功能實現
1 查找對話框界面實現
查找對話框需求分析:
- 可復用軟件部分。
- 查找文本框中的指定字符串。
- 能夠指定查找方向。
- 支持大小寫敏感查找。
附加需求:
- 點擊關閉按鈕后隱藏。
查找對話框的架構與設計:
查找對話框的界面與布局:
FindDialog.h:
FindDialog.cpp:
#include "FindDialog.h" #include <QEvent>FindDialog::FindDialog(QWidget *parent) : QDialog(parent, Qt::WindowCloseButtonHint | Qt::Drawer) {m_findLbl.setText("Find What:");m_findBtn.setText("Find Next");m_closeBtn.setText("Close");m_matchChkBx.setText("Match Case");m_backwardBtn.setText("Backward");m_forwardBtn.setText("Forward");m_forwardBtn.setChecked(true);m_radioGrpBx.setTitle("Direction");m_hbLayout.addWidget(&m_forwardBtn);m_hbLayout.addWidget(&m_backwardBtn);m_radioGrpBx.setLayout(&m_hbLayout);m_layout.setSpacing(10);m_layout.addWidget(&m_findLbl, 0, 0);m_layout.addWidget(&m_findEdit, 0, 1);m_layout.addWidget(&m_findBtn, 0, 2);m_layout.addWidget(&m_matchChkBx, 1, 0);m_layout.addWidget(&m_radioGrpBx, 1, 1);m_layout.addWidget(&m_closeBtn, 1, 2);setLayout(&m_layout);setWindowTitle("Find"); }bool FindDialog::event(QEvent* evt) {if( evt->type() == QEvent::Close ){hide();return true;}return QDialog::event(evt); }MainWindow中需要增加成員:
槽函數的綁定與實現:
2 查找對話框的功能實現
文本查找功能的核心思想:
QString類中提供了子串查找的相關函數:
- indexof:從指定位置向后查找目標子串的下標位置。
- lastIndexof:從指定位置向前查找目標子串的下標位置。
QS同日那個類中查找函數所使用的下標位置:
Qt中的光標信息類QTextCursor:
- 文本框中的光標是一個QTextCursor對象。
- 所有與光標相關的信息都通過QTextCursor描述:
- 如:光標位置、文本選擇等等。
查找算法流程圖:
MainWindow與FindDialog之間的關系圖:
可以看出是一種弱耦合的關系,采用聚合關系比較好,也就是使用指針。
- 如:光標位置、文本選擇等等。
最終版本的實現如下:
FindDialog.h:
FindDialog.cpp:
#include "FindDialog.h" #include <QEvent> #include <QTextCursor> #include <QMessageBox>FindDialog::FindDialog(QWidget *parent, QPlainTextEdit* pText): QDialog(parent, Qt::WindowCloseButtonHint | Qt::Drawer) {initControl();connectSlot();setLayout(&m_layout);setWindowTitle("Find");setPlainTextEdit(pText); }void FindDialog::initControl() {m_findLbl.setText("Find What:");m_findBtn.setText("Find Next");m_closeBtn.setText("Close");m_matchChkBx.setText("Match Case");m_backwardBtn.setText("Backward");m_forwardBtn.setText("Forward");m_forwardBtn.setChecked(true);m_radioGrpBx.setTitle("Direction");m_hbLayout.addWidget(&m_forwardBtn);m_hbLayout.addWidget(&m_backwardBtn);m_radioGrpBx.setLayout(&m_hbLayout);m_layout.setSpacing(10);m_layout.addWidget(&m_findLbl, 0, 0);m_layout.addWidget(&m_findEdit, 0, 1);m_layout.addWidget(&m_findBtn, 0, 2);m_layout.addWidget(&m_matchChkBx, 1, 0);m_layout.addWidget(&m_radioGrpBx, 1, 1);m_layout.addWidget(&m_closeBtn, 1, 2);}void FindDialog::connectSlot() {connect(&m_findBtn, SIGNAL(clicked()), this, SLOT(onFindClicked()));connect(&m_closeBtn, SIGNAL(clicked()), this, SLOT(onCloseClicked())); }void FindDialog::setPlainTextEdit(QPlainTextEdit* pText) {m_pText = pText; }QPlainTextEdit* FindDialog::getPlainTextEdit() {return m_pText; }bool FindDialog::event(QEvent* evt) {if( evt->type() == QEvent::Close ){hide();return true;}return QDialog::event(evt); }void FindDialog::onFindClicked() {QString target = m_findEdit.text();if( (m_pText != NULL) && (target != "") ){QString text = m_pText->toPlainText();QTextCursor c = m_pText->textCursor();int index = -1;if( m_forwardBtn.isChecked() ){index = text.indexOf(target, c.position(), m_matchChkBx.isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive);if( index >= 0 ){c.setPosition(index);c.setPosition(index + target.length(), QTextCursor::KeepAnchor);m_pText->setTextCursor(c);}}if( m_backwardBtn.isChecked() ){index = text.lastIndexOf(target, c.position() - text.length() - 1, m_matchChkBx.isChecked() ? Qt::CaseSensitive : Qt::CaseInsensitive);if( index >= 0 ){c.setPosition(index + target.length());c.setPosition(index, QTextCursor::KeepAnchor);m_pText->setTextCursor(c);}}if( index < 0 ){QMessageBox msg(this);msg.setWindowTitle("Find");msg.setText("Can not find \"" + target + "\" any more...");msg.setIcon(QMessageBox::Information);msg.setStandardButtons(QMessageBox::Ok);msg.exec();}} }void FindDialog::onCloseClicked() {close(); }MainWindow的構造函數需要修改:
為了解決文本框得到焦點和失去焦點被選擇文本的樣式保持一致,我們需要使用調色板對mainEditor進行設置,設置如下:
參考資料:
總結
以上是生活随笔為你收集整理的文本编辑器中查找对话框及功能实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 东坡肘子怎么做猪肘烂软、肉质细嫩?
- 下一篇: 任务状态的查询