最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Qt實(shí)現(xiàn)文本編輯器(二)

 更新時間:2022年01月25日 09:20:51   作者:中國好公民st  
這篇文章主要介紹了利用Qt實(shí)現(xiàn)的一個文本編輯器。本文將具體講解下是如何實(shí)現(xiàn)菜單欄以及工具欄上對應(yīng)的需求,感興趣的可以動手試一試

上一章節(jié)講述了如何制作文本編輯頁面,以及應(yīng)該有哪些功能需要實(shí)現(xiàn),只是做了展示效果,實(shí)際的點(diǎn)擊事件并沒有處理。今天來具體講解下是如何實(shí)現(xiàn)菜單欄以及工具欄上對應(yīng)的需求吧~

功能實(shí)現(xiàn)

功能:

1、動作消息觸發(fā)

2、具體功能:打開文件、新建文件、復(fù)制、剪切、粘貼

3、文本編輯功能:字體設(shè)置

今天只講述以上三大功能,至于:旋轉(zhuǎn)、縮放等功能都是針對于圖片來說的,等下一章節(jié),具體的講解方式就不在是文本編輯器的功能了,靜待后續(xù)更文吧!

功能1:動作消息

上一章節(jié)的動作已經(jīng)創(chuàng)建完成了,那么該如何觸發(fā)這些動作呢?

在Qt中動作觸發(fā)方式與控件觸發(fā)方式是一致的,例如:想要讓一個按鈕控件響應(yīng)操作,需要響應(yīng)QPushButton::clicked消息,這里也是同樣的道理。

想要響應(yīng)動作事件用到的是QAction::triggered。

各個動作對應(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),對于復(fù)制、剪切、粘貼功能都是采用QTextEdit控件實(shí)現(xiàn)的,在這里不需要做新的處理,直接使用父類消息就可以了。

為了對編輯文本類的功能處理,最好的方式繼承自QTextEdit進(jìn)行功能封裝,假設(shè)叫做:QMyTextEdit,后續(xù)都用該類作為編輯文本類

功能2:動作事件實(shí)現(xiàn)

針對上述兩個需要自己實(shí)現(xiàn)的槽函數(shù)響應(yīng),接下來就進(jìn)行詳細(xì)的講述吧~

2.1:打開文件

打開文件,代表的是打開一個已經(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);
	}
}

代碼思路:

獲取打開的文件路徑,如果返回的字符串是空,說明未打開有效文件,不進(jìn)行處理;

在展示內(nèi)容之前,判斷當(dāng)前edit控件是否有數(shù)據(jù)?如果沒有直接在當(dāng)前文本編輯控件中展示;

如果當(dāng)前文本編輯控件存在數(shù)據(jù),則重新創(chuàng)建一個QMyTextEdit自定義類,用來展示新內(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());
		}
	}
}

代碼說明:

采用了QTextStream方式讀取文件流數(shù)據(jù),可以方便的讀寫單詞、行和數(shù)字,甚至還提供了填充、對齊和數(shù)字格式化的選項(xiàng)操作。

為什么第一個參數(shù)會傳入類指針呢?

因?yàn)樵谶@里有個功能,叫做新建,在讀取文件的時候,假設(shè)當(dāng)前展示的文本編輯器類QMyEdit中存在了內(nèi)容時,是需要重新創(chuàng)建的,為了統(tǒng)一起見,將第一個參數(shù)設(shè)置為類指針,方便函數(shù)調(diào)用。

無論是新創(chuàng)建的頁面還是已經(jīng)存在的頁面都可以進(jìn)行寫入文本。

2.2:新建文件

在這里所謂的新建就是建立一個空白的編輯文本,功能簡單,這里就不再過多說明了。

void QtTextEditor::OnTriggeredNewFile()
{
	QMyTextEdit *editCtrls = new QMyTextEdit;
	editCtrls->show();
	m_vetEditCtrls.push_back(editCtrls);
}

唯一需要提一句的就是:創(chuàng)建了新的文本類之后,一定要記得存儲類指針,為了防止在后續(xù)使用的過程中查詢不到以及在銷毀的過程中,防止內(nèi)存泄漏。

2.3:復(fù)制、剪貼、粘貼

這三個功能都沿用的QTextEdit自帶功能,這里不用再過多說明,直接響應(yīng)父類消息就可以了。

功能3:文本編輯

大家都用過文本編輯器,主要的功能還是對文字的操作,那么在這里主要講述了文字工具欄以及文字的展示風(fēng)格

3.1 文字工具欄

正如上一章節(jié)講述那般,工具條的使用大家都不陌生了吧,這里需要創(chuàng)建一個字體工具欄,并包含了如下幾個功能:

功能名稱類名
字體樣式m_ComboFontStyleQFontComboBox
字體選擇框m_ComboFontSizeQComboBox
字體加粗m_btnFontBoldQToolButton
字體傾斜m_btnFontItalicQToolButton
字體顏色值m_btnFontColorQToolButton

實(shí)際做出來的效果,如下:

對于字體的設(shè)置,與其它工具條上展示的內(nèi)容不一致,不再采用動作,而是使用了控件的方式

具體每個功能對應(yīng)的類名上面的表格已經(jīng)說明了,重點(diǎn)要說的是:獲取字體風(fēng)格以及字體的大小

字體風(fēng)格

QFontCombobox是QComboBox的一個子類,是不能被編輯的,只能用來選擇字體。

m_ComboFontStyle = new QFontComboBox;
m_ComboFontStyle->setFontFilters(QFontComboBox::ScalableFonts);

字體字號

采用的是:QFontDatabase,提供了有關(guān)底層窗口系統(tǒng)中可用的字體信息,當(dāng)前主要用來查詢字體大小的。

m_ComboFontSize = new QComboBox;
QFontDatabase dbFont;
foreach(int size, dbFont.standardSizes())
{
	m_ComboFontSize->addItem(QString::number(size));
}

代碼解析:

這里使用了foreach的方式,代替了for循環(huán),要是有不懂得小伙伴可以詳細(xì)查詢,這里只是做了解釋說明~

standarSizes函數(shù),返回了可用的標(biāo)準(zhǔn)字號的列表,并將列表內(nèi)容插入到QCombobox中。

另外說明:QToolButton與QPushButton的用法一致,只是換了類名,創(chuàng)建方法以及消息綁定都不再過多說明了。

最后,將創(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)行起來。

在這里需要注意的是:為什么運(yùn)行起來是下面這個樣子?

有沒有人有這種情況?為什么和第一張效果圖不一樣呢?不是另起一行,而是什么都看不到了呢?

在ToolBar中,如果一行展示不全的情況下,需要告訴QToolBar另起一行,則,需要在addToolBar之前添加如下代碼:

this->addToolBarBreak(Qt::TopToolBarArea);

再次運(yùn)行,就變成了兩行的工具欄了,踩坑記錄,希望大家也不要犯這個錯誤啦~

3.2:字體風(fēng)格

在這里,說到的字體風(fēng)格無外乎就是工具欄上所展示的內(nèi)容啦!

文字風(fēng)格這部分都采用了QTextCharFormat對象進(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)前控件上的文本并沒有被選中,就指定光標(biāo)區(qū)域所在的詞為高亮選定詞,從而設(shè)置字體風(fēng)格樣式

字號

fmt.setFontPointSize(qsText.toInt());

加粗

fmt.setFontWeight(bCheck);

斜體

fmt.setFontItalic(bchecked);

以上幾個功能,用法都很類似,正如我前面提到的,都是采用QTextCharFormat類,只是設(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)格就講解完成了,在整個設(shè)置過程中,最最重要的類就是:QTextCharFormat。

在代碼使用過程中,大家會發(fā)現(xiàn),我一直是對m_editContent進(jìn)行操作的,是滴!

其實(shí)是存在新建功能的,這里的新建空白文本的文字處理功能就交給大家啦,這是只是做一個示范例子而已,提前說明下,不是很難,只要掌握了當(dāng)前處于活躍的QMyEdit類指針就可以了。

以上就是Qt實(shí)現(xiàn)文本編輯器(二)的詳細(xì)內(nèi)容,更多關(guān)于Qt文本編輯器的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 遞歸形式與非遞歸形式的斐波那契數(shù)列的用法分析

    遞歸形式與非遞歸形式的斐波那契數(shù)列的用法分析

    本篇文章是對遞歸形式與非遞歸形式的斐波那契數(shù)列的用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • 詳解QListWidget如何實(shí)現(xiàn)自定義Item效果

    詳解QListWidget如何實(shí)現(xiàn)自定義Item效果

    這篇文章主要為大家介紹了如何通過QListWidget實(shí)現(xiàn)自定義Item效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解一下
    2022-04-04
  • C語言鏈表實(shí)現(xiàn)貪吃蛇游戲

    C語言鏈表實(shí)現(xiàn)貪吃蛇游戲

    這篇文章主要為大家詳細(xì)介紹了C語言鏈表實(shí)現(xiàn)貪吃蛇游戲源碼,適合C語言入門者學(xué)習(xí)閱讀,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • OpenCV透視變換應(yīng)用之書本視圖矯正+廣告屏幕切換

    OpenCV透視變換應(yīng)用之書本視圖矯正+廣告屏幕切換

    透視變換是指利用透視中心、像點(diǎn)、目標(biāo)點(diǎn)三點(diǎn)共線的條件,按透視旋轉(zhuǎn)定律使承影面繞跡線旋轉(zhuǎn)某一角度,破壞原有的投影光線束,仍能保持承影面上投影幾何圖形不變的變換。本文將為大家介紹兩個OpenCV透視變換應(yīng)用,需要的可以參考一下
    2022-08-08
  • QT編寫tcp通信工具(Client篇)

    QT編寫tcp通信工具(Client篇)

    這篇文章主要介紹了QT編寫tcp通信工具,適用于Client端,類似網(wǎng)上常見的網(wǎng)絡(luò)調(diào)試工具,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++內(nèi)存對象布局小測試

    C++內(nèi)存對象布局小測試

    這篇文章主要介紹了C++內(nèi)存對象布局小測試,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • C語言使用回溯法解旅行售貨員問題與圖的m著色問題

    C語言使用回溯法解旅行售貨員問題與圖的m著色問題

    回溯法即是在按條件搜索走不通的情況下退回再選擇其他路線的方法,這里我們來看C語言使用回溯法解旅行售貨員問題與圖的m著色問題的方法示例:
    2016-07-07
  • C++中聲明、定義、初始化、賦值區(qū)別介紹

    C++中聲明、定義、初始化、賦值區(qū)別介紹

    在?C++?中,聲明、定義、初始化、賦值是變量的四個基本操作,很多朋友不清楚他們之間有什么區(qū)別,今天通過本文給大家介紹下C++中聲明、定義、初始化、賦值區(qū)別,感興趣的朋友一起看看吧
    2023-05-05
  • C++ 自定義棧實(shí)現(xiàn)迷宮求解

    C++ 自定義棧實(shí)現(xiàn)迷宮求解

    這篇文章主要介紹了C++ 自定義棧實(shí)現(xiàn)迷宮求解的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • VSCode之CMake使用小結(jié)

    VSCode之CMake使用小結(jié)

    本文主要介紹了VSCode之CMake使用小結(jié),文中通過圖文介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03

最新評論

遵化市| 托克托县| 西昌市| 庆城县| 手游| 海原县| 临安市| 滨海县| 松桃| 恩施市| 昔阳县| 常德市| 宿迁市| 防城港市| 霍山县| 闸北区| 枣庄市| 尉氏县| 潞西市| 民乐县| 正蓝旗| 花莲市| 当阳市| 泗阳县| 兰溪市| 南昌市| 九台市| 阆中市| 桐庐县| 镇宁| 庆安县| 巫溪县| 泽州县| 屏边| 泰州市| 隆安县| 天全县| 梁山县| 定远县| 彭山县| 波密县|