Qt實(shí)現(xiàn)文本編輯器(二)
上一章節(jié)講述了如何制作文本編輯頁(yè)面,以及應(yīng)該有哪些功能需要實(shí)現(xiàn),只是做了展示效果,實(shí)際的點(diǎn)擊事件并沒(méi)有處理。今天來(lái)具體講解下是如何實(shí)現(xiàn)菜單欄以及工具欄上對(duì)應(yīng)的需求吧~
功能實(shí)現(xiàn)
功能:
1、動(dòng)作消息觸發(fā)
2、具體功能:打開文件、新建文件、復(fù)制、剪切、粘貼
3、文本編輯功能:字體設(shè)置
今天只講述以上三大功能,至于:旋轉(zhuǎn)、縮放等功能都是針對(duì)于圖片來(lái)說(shuō)的,等下一章節(jié),具體的講解方式就不在是文本編輯器的功能了,靜待后續(xù)更文吧!
功能1:動(dòng)作消息
上一章節(jié)的動(dòng)作已經(jīng)創(chuàng)建完成了,那么該如何觸發(fā)這些動(dòng)作呢?
在Qt中動(dòng)作觸發(fā)方式與控件觸發(fā)方式是一致的,例如:想要讓一個(gè)按鈕控件響應(yīng)操作,需要響應(yīng)QPushButton::clicked消息,這里也是同樣的道理。
想要響應(yīng)動(dòng)作事件用到的是QAction::triggered。
各個(gè)動(dòng)作對(duì)應(yīng)的槽函數(shù)如下
打開文件
connect(m_pActionOpenFile, &QAction::triggered, this, &QtTextEditor::OnTriggeredOpenFile);
新建文件
connect(m_pActionOpenFile, &QAction::triggered, this, &QtTextEditor::OnTriggeredNewFile);
復(fù)制、剪切、粘貼
connect(m_pActionOpenFile, &QAction::triggered, m_editContent, &QTextEdit::copy); connect(m_pActionOpenFile, &QAction::triggered, m_editContent, &QTextEdit::cut); connect(m_pActionOpenFile, &QAction::triggered, m_editContent, &QTextEdit::paste);
看到槽函數(shù),大家可以發(fā)現(xiàn),對(duì)于復(fù)制、剪切、粘貼功能都是采用QTextEdit控件實(shí)現(xiàn)的,在這里不需要做新的處理,直接使用父類消息就可以了。
為了對(duì)編輯文本類的功能處理,最好的方式繼承自QTextEdit進(jìn)行功能封裝,假設(shè)叫做:QMyTextEdit,后續(xù)都用該類作為編輯文本類
功能2:動(dòng)作事件實(shí)現(xiàn)
針對(duì)上述兩個(gè)需要自己實(shí)現(xiàn)的槽函數(shù)響應(yīng),接下來(lái)就進(jìn)行詳細(xì)的講述吧~
2.1:打開文件
打開文件,代表的是打開一個(gè)已經(jīng)存在的文件,這里需要用到QFileDialog類,使用QFileDialog::getOpenFileName()靜態(tài)函數(shù),返回選擇文件的帶路徑的完整路徑名。
void QtTextEditor::OnTriggeredOpenFile() { QString qsFileName = QFileDialog::getOpenFileName(this); if (qsFileName.isEmpty()) { return; } if (m_editContent->document()->isEmpty()) { this->LoadFileContent(m_editContent, qsFileName); } else { QMyTextEdit *editContent = new QMyTextEdit; editContent->show(); this->LoadFileContent(editContent, qsFileName); m_vetEditCtrls.push_back(editContent); } }
代碼思路:
獲取打開的文件路徑,如果返回的字符串是空,說(shuō)明未打開有效文件,不進(jìn)行處理;
在展示內(nèi)容之前,判斷當(dāng)前edit控件是否有數(shù)據(jù)?如果沒(méi)有直接在當(dāng)前文本編輯控件中展示;
如果當(dāng)前文本編輯控件存在數(shù)據(jù),則重新創(chuàng)建一個(gè)QMyTextEdit自定義類,用來(lái)展示新內(nèi)容。
其中,LoadFileContent函數(shù)的具體內(nèi)容:
void QtTextEditor::LoadFileContent(QMyTextEdit* editCtrls, QString qsFileName) { QFile file(qsFileName); if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { QTextStream textStream(&file); while (!textStream.atEnd()) { editCtrls->append(textStream.readLine()); } } }
代碼說(shuō)明:
采用了QTextStream方式讀取文件流數(shù)據(jù),可以方便的讀寫單詞、行和數(shù)字,甚至還提供了填充、對(duì)齊和數(shù)字格式化的選項(xiàng)操作。
為什么第一個(gè)參數(shù)會(huì)傳入類指針呢?
因?yàn)樵谶@里有個(gè)功能,叫做新建,在讀取文件的時(shí)候,假設(shè)當(dāng)前展示的文本編輯器類QMyEdit中存在了內(nèi)容時(shí),是需要重新創(chuàng)建的,為了統(tǒng)一起見,將第一個(gè)參數(shù)設(shè)置為類指針,方便函數(shù)調(diào)用。
無(wú)論是新創(chuàng)建的頁(yè)面還是已經(jīng)存在的頁(yè)面都可以進(jìn)行寫入文本。
2.2:新建文件
在這里所謂的新建就是建立一個(gè)空白的編輯文本,功能簡(jiǎn)單,這里就不再過(guò)多說(shuō)明了。
void QtTextEditor::OnTriggeredNewFile() { QMyTextEdit *editCtrls = new QMyTextEdit; editCtrls->show(); m_vetEditCtrls.push_back(editCtrls); }
唯一需要提一句的就是:創(chuàng)建了新的文本類之后,一定要記得存儲(chǔ)類指針,為了防止在后續(xù)使用的過(guò)程中查詢不到以及在銷毀的過(guò)程中,防止內(nèi)存泄漏。
2.3:復(fù)制、剪貼、粘貼
這三個(gè)功能都沿用的QTextEdit自帶功能,這里不用再過(guò)多說(shuō)明,直接響應(yīng)父類消息就可以了。
功能3:文本編輯
大家都用過(guò)文本編輯器,主要的功能還是對(duì)文字的操作,那么在這里主要講述了文字工具欄以及文字的展示風(fēng)格
3.1 文字工具欄
正如上一章節(jié)講述那般,工具條的使用大家都不陌生了吧,這里需要?jiǎng)?chuàng)建一個(gè)字體工具欄,并包含了如下幾個(gè)功能:
功能 | 名稱 | 類名 |
---|---|---|
字體樣式 | m_ComboFontStyle | QFontComboBox |
字體選擇框 | m_ComboFontSize | QComboBox |
字體加粗 | m_btnFontBold | QToolButton |
字體傾斜 | m_btnFontItalic | QToolButton |
字體顏色值 | m_btnFontColor | QToolButton |
實(shí)際做出來(lái)的效果,如下:
對(duì)于字體的設(shè)置,與其它工具條上展示的內(nèi)容不一致,不再采用動(dòng)作,而是使用了控件的方式
具體每個(gè)功能對(duì)應(yīng)的類名上面的表格已經(jīng)說(shuō)明了,重點(diǎn)要說(shuō)的是:獲取字體風(fēng)格以及字體的大小
字體風(fēng)格
QFontCombobox是QComboBox的一個(gè)子類,是不能被編輯的,只能用來(lái)選擇字體。
m_ComboFontStyle = new QFontComboBox; m_ComboFontStyle->setFontFilters(QFontComboBox::ScalableFonts);
字體字號(hào)
采用的是:QFontDatabase,提供了有關(guān)底層窗口系統(tǒng)中可用的字體信息,當(dāng)前主要用來(lái)查詢字體大小的。
m_ComboFontSize = new QComboBox; QFontDatabase dbFont; foreach(int size, dbFont.standardSizes()) { m_ComboFontSize->addItem(QString::number(size)); }
代碼解析:
這里使用了foreach的方式,代替了for循環(huán),要是有不懂得小伙伴可以詳細(xì)查詢,這里只是做了解釋說(shuō)明~
standarSizes函數(shù),返回了可用的標(biāo)準(zhǔn)字號(hào)的列表,并將列表內(nèi)容插入到QCombobox中。
另外說(shuō)明:QToolButton與QPushButton的用法一致,只是換了類名,創(chuàng)建方法以及消息綁定都不再過(guò)多說(shuō)明了。
最后,將創(chuàng)建的這些控件綁定到字體工具條上
m_pToolFont = addToolBar("Font"); m_pToolFont->setAllowedAreas(Qt::BottomToolBarArea ); m_pToolFont->addWidget(m_labFontStyle); m_pToolFont->addWidget(m_ComboFontStyle); m_pToolFont->addWidget(m_labFontSize); m_pToolFont->addWidget(m_ComboFontSize); m_pToolFont->addSeparator(); m_pToolFont->addWidget(m_btnFontBold); m_pToolFont->addWidget(m_btnFontItalic); m_pToolFont->addSeparator(); m_pToolFont->addWidget(m_btnFontColor);
看到這里,大家可以嘗試下自己寫的代碼,看看是不是可以運(yùn)行起來(lái)。
在這里需要注意的是:為什么運(yùn)行起來(lái)是下面這個(gè)樣子?
有沒(méi)有人有這種情況?為什么和第一張效果圖不一樣呢?不是另起一行,而是什么都看不到了呢?
在ToolBar中,如果一行展示不全的情況下,需要告訴QToolBar另起一行,則,需要在addToolBar之前添加如下代碼:
this->addToolBarBreak(Qt::TopToolBarArea);
再次運(yùn)行,就變成了兩行的工具欄了,踩坑記錄,希望大家也不要犯這個(gè)錯(cuò)誤啦~
3.2:字體風(fēng)格
在這里,說(shuō)到的字體風(fēng)格無(wú)外乎就是工具欄上所展示的內(nèi)容啦!
文字風(fēng)格這部分都采用了QTextCharFormat對(duì)象進(jìn)行實(shí)現(xiàn)的
字體風(fēng)格
void QtTextEditor::OnComboFontStyle(QString& qsText) { QTextCharFormat fmt; fmt.setFontFamily(qsText); QTextCursor cursor = m_editContent->textCursor(); if (!cursor.hasSelection()) { cursor.select(QTextCursor::WordUnderCursor); } cursor.mergeCharFormat(fmt); m_editContent->mergeCurrentCharFormat(fmt); }
代碼解析:
獲取控件的焦點(diǎn),假設(shè)當(dāng)前控件上的文本并沒(méi)有被選中,就指定光標(biāo)區(qū)域所在的詞為高亮選定詞,從而設(shè)置字體風(fēng)格樣式
字號(hào)
fmt.setFontPointSize(qsText.toInt());
加粗
fmt.setFontWeight(bCheck);
斜體
fmt.setFontItalic(bchecked);
以上幾個(gè)功能,用法都很類似,正如我前面提到的,都是采用QTextCharFormat類,只是設(shè)置的函數(shù)不同,具體的功能不在做過(guò)多說(shuō)明,下面,與上述幾個(gè)功能相比較,需要說(shuō)明的是:顏色設(shè)置。
字體顏色
在這時(shí)顏色的時(shí)候,用到了系統(tǒng)文件類:QColorDialog,與打開文件的方式類似,只是類名不一致
void QtTextEditor::OnToolFontColor(bool bchecked) { QColor color = QColorDialog::getColor(Qt::red, this); if (color.isValid()) { QTextCharFormat fmt; fmt.setForeground(color); m_editContent->mergeCurrentCharFormat(fmt); } }
根據(jù)以上功能,具體的顯示效果如下:
總結(jié)
到這里,具體的文本風(fēng)格就講解完成了,在整個(gè)設(shè)置過(guò)程中,最最重要的類就是:QTextCharFormat。
在代碼使用過(guò)程中,大家會(huì)發(fā)現(xiàn),我一直是對(duì)m_editContent進(jìn)行操作的,是滴!
其實(shí)是存在新建功能的,這里的新建空白文本的文字處理功能就交給大家啦,這是只是做一個(gè)示范例子而已,提前說(shuō)明下,不是很難,只要掌握了當(dāng)前處于活躍的QMyEdit類指針就可以了。
以上就是Qt實(shí)現(xiàn)文本編輯器(二)的詳細(xì)內(nèi)容,更多關(guān)于Qt文本編輯器的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++學(xué)習(xí)之算術(shù)運(yùn)算符使用詳解
運(yùn)算符是計(jì)算機(jī)語(yǔ)言提供的能對(duì)數(shù)據(jù)進(jìn)行基本運(yùn)算操作的功能體。而算術(shù)運(yùn)算符用來(lái)對(duì)數(shù)字型數(shù)據(jù)進(jìn)行數(shù)學(xué)語(yǔ)義上的加、減、乘、除。本文通過(guò)講解清楚算術(shù)運(yùn)算符,讓大家了解使用C++運(yùn)算符時(shí)應(yīng)該注意的事項(xiàng)2022-06-06C/C++雜記 虛函數(shù)的實(shí)現(xiàn)的基本原理(圖文)
這篇文章主要介紹了C/C++雜記 虛函數(shù)的實(shí)現(xiàn)的基本原理(圖文),需要的朋友可以參考下2016-06-06C++/Php/Python/Shell 程序按行讀取文件或者控制臺(tái)的實(shí)現(xiàn)
下面小編就為大家?guī)?lái)一篇C++/Php/Python/Shell 程序按行讀取文件或者控制臺(tái)的實(shí)現(xiàn)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03