版權聲明
該文章原創於Qter開源社區(www.qter.org),作者yafeilinux,轉載請注明出處!
導語
這一篇我們來加上查找菜單的功能。因為要涉及Qt Creator的很多實用功能,所以單獨用一篇文章來介紹。以前都用設計器設計界面,而這次我們用代碼實現一個簡單的查找對話框。除了講解怎么實現查找功能,這里還詳細地說明了怎么進行類中方法的查找和使用。其中也講解了Qt Creator程序中怎樣在函數的聲明位置和定義位置間進行快速切換。
環境是:
Windows 7 + Qt 4.8.1+ Qt Creator 2.4.1
目錄
一、添加查找對話框
二、實現查找功能
正文
一、添加查找對話框
1.
我們繼續在前一篇程序的基礎之上進行更改。首先到mainwindow.h文件中添加類的前置聲明(對於什么是前置聲明,以及這樣使用的好處,可以在網上百度):
class
QLineEdit
;
class
QDialog
;
前置聲明所在的位置跟頭文件包含的位置相同。
然后在private中添加對象定義:
QLineEdit
*
findLineEdit
;
QDialog
*
findDlg
;
下面再添加一個私有槽聲明:
private
slots
:
void
showFindText();
槽可以看做是一個函數,只不過可以和信號進行關聯。
2.
下面到mainwindow.cpp文件中,因為前面在頭文件中使用了類的前置聲明,所以這里需要先添加頭文件包含:
#include
<QLineEdit>
#include
<QDialog>
#include
<QPushButton>
然后在構造函數中進行初始化操作,即添加如下代碼:
findDlg = new QDialog(this);
findDlg->setWindowTitle(tr("
查找"
));
findLineEdit = new QLineEdit(findDlg);
QPushButton
*
btn= new QPushButton(tr("
查找下一個"
),
findDlg);
QVBoxLayout
*
layout= new QVBoxLayout(findDlg);
layout->addWidget(findLineEdit);
layout->addWidget(btn);
connect(btn, SIGNAL(clicked()), this, SLOT(showFindText()));
這里創建了一個對話框,然后將一個行編輯器和一個按鈕放到了上面,並使用布局管理器進行布局。最后將按鈕的單擊信號關聯到了自定義的顯示查找到的文本槽上。下面來添加該槽的定義。
3.
這里先說一個可以快速從頭文件聲明處創建函數定義的方法。到mainwindow.h文件中,將鼠標定位到showFindText()函數上,然后點擊右鍵,在彈出的菜單中選擇“重構”→“在mainwindow.cpp添加聲明”,或者直接使用Alt+Enter快捷鍵,這樣就會直接在mainwindow.cpp文件中添加函數定義,並跳轉到該函數處。如下圖所示。
<ignore_js_op>

二、實現查找功能
下面我們來分步驟完成showFindText()函數。在講解過程中會涉及一些很實用的功能的介紹。
1.
先在函數中添加一行代碼來獲取行編輯器中要查找的字符串。
void
MainWindow
::
showFindText()
{
QString
str
=
findLineEdit
->
text();
}
2.
在下一行,我們先輸入ui,然后按下鍵盤上的“>.”鍵,這時就會自動輸入“.”或者“->”,並且列出ui上所有可用部件的對象名。如下圖所示。
<ignore_js_op>

3.
我們要輸入textEdit,先輸入t,這時會自動彈出textEdit,只需要按下回車鍵即可。如下圖所示。
<ignore_js_op>

4.
下面我們將光標放到textEdit上,這時就會出現QTextEdit類的簡單介紹,如下圖所示。
<ignore_js_op>

5.
按照提示,我們按下鍵盤上的F1鍵,就會在編輯器的右側打開QTextEdit類的幫助文檔。如下圖所示。這時還可以按下上面的“切換至幫助模式”來進入到幫助模式中打開該文檔。
<ignore_js_op>

6.
我們在該類的Public Functions公共函數列表中發現有一個find()函數。如下圖所示。
<ignore_js_op>

7.
從字面意思上可以知道該函數應該是用於查找功能的,我們點擊該函數進入到它的詳細介紹處。如下圖所示。
<ignore_js_op>

8.
根據介紹可以知道該函數用於查詢指定的exp字符串,如果找到了就將光標跳轉到查找到的位置,如果沒有找到就返回false。這個函數還有一個QTextDocument::FindFlags參數,為了了解該參數的意思,我們點擊該參數進入其詳細介紹處。如下圖所示。
<ignore_js_op>

可以看到該參數是一個枚舉變量,用來指定查找的方式,分別是向后查找、區分大小寫、全詞匹配等。如果不指定該參數,默認的是向前查找、不區分大小寫、包含該字符串的詞也可以查找到。這幾個變量還可以使用“|”符號來一起使用。
9.
根據幫助,我們補充完該行代碼:
ui
->
textEdit
->
find(str, QTextDocument::FindBackward);
10.
這時已經能實現查找的功能了。但是我們剛才看到find的返回值類型是bool型,而且,我們也應該為查找不到字符串作出提示。將這行代碼更改為:
if
(!
ui->textEdit->find(str, QTextDocument::FindBackward))
{
QMessageBox
::
warning(this, tr("
查找"
),
tr("
找不到%1"
).
arg(str));
}
到這里查找函數就基本講完了。
11.
我們會發現隨着程序功能的增強,其中的函數也會越來越多,我們都會為查找某個函數的定義位置感到頭疼。而在QtCreator中有幾種快速定位函數的方法。
第一種,在函數聲明的地方直接跳轉到函數定義的地方。
例如我們在mainwindow.h文件的loadFile()函數上點擊鼠標右鍵,在彈出的菜單上選擇“在方法聲明/定義之間切換”,這時就會自動跳轉到mainwindow.cpp文件中該函數的定義處。如下圖所示。當然還可以反向使用。
<ignore_js_op>

第二種,快速查看一個文件里的所有函數。
可以在編輯器正上方的下拉框里查看正在編輯的文件中所有的函數的列表,點擊一個函數就會跳轉到指定位置。如下圖所示。
<ignore_js_op>

第三種,使用類視圖或者大綱視圖。
在項目列表上面的下拉框中可以更改查看的內容,如果選擇為類視圖或者大綱,則會顯示文件中所有的函數的列表。如下圖所示。
<ignore_js_op>

第四種,使用查找功能查看函數的所有調用處。
在一個函數名上點擊鼠標右鍵,然后選擇“查找何處被使用”菜單,這時就會在下面的搜索結果欄中顯示該函數所有的使用位置。我們可以通過點擊一個位置來跳轉到該位置。如下圖所示。
<ignore_js_op>

12.
最后,我們來實現界面上的查找功能。從設計模式進入查找動作的觸發信號的槽,更改如下:
void
MainWindow
::
on_action_Find_triggered()
{
findDlg
->
show();
}
這時運行程序,效果如下圖所示。
<ignore_js_op>

結語
講到這里,我們已經很詳細地說明了怎樣去使用一個類里面未接觸過的函數;也說明了Qt Creator中的一些便捷操作。可以看到,Qt Creator開發環境,有很多很人性化的設計,我們應該熟練應用它們。在以后的文章中,我們不會再很詳細地去用幫助來說明一個函數是怎么來的,該怎么用,這些應該自己試着去查找。