1. 程式人生 > >QTextEdit更改特定某些行的字型格式

QTextEdit更改特定某些行的字型格式

在QT的顯示過程中,往往會出於某種需要來改變特定某些行的輸入格式,如下圖,異常的情況下我希望異常資訊以紅色顯示,但QTextEdit作為一個整體,往往改變了一個輸入整體就都變了,比如說改變了字型顏色整個QTextEdit中的顏色都會發生改變。經過查詢,用html可以實現如下圖的效果,但是用html又有一個新的問題,就是中文顯示的問題。在同學的幫助下,終於成功實現了利用html更改特定行的輸入格式並顯示圖中的效果,現將程式碼做簡單整理,或許對某些有同樣需求的同行有所幫助。

關鍵程式碼只有三行,先給出程式碼後做解釋:

QString tmpqstring1 = GBK::ToUnicode("<br/><span style='color:#FF4500;'>輕微波動</span><br/><br/>");
string tmpstring1 = tmpqstring1.toStdString();
ui.statusCollect->insertHtml(tmpstring1.c_str());
注意,第一行的GBK是一個阿發老師寫的一個編碼格式轉換的類(推薦其QT課程),ToUnicode就是將欲輸入的轉換為Unicode格式,放在標頭檔案裡引用就好了,具體程式碼最後給出。第一行中主要是html格式設定了顏色為紅色,中文為“輕微波動”,第二行程式碼轉為string型別,第三行取c_str()然後以html的格式插入到QTextEdit中去,這樣就可以利用html在QTextEdit中某些特定行以特定格式顯示中文了。我不太熟悉html,但是這樣的確可以實現中文特定格式顯示在QTextEdit中的特定位置。就是這麼神奇!
#ifndef _QT_GBK_H
#define _QT_GBK_H
#include <QString>
#include <QTextCodec>
#include <string>
using std::string;
class GBK
{
public:
	// QString(Unicode) -> std::string (GBK)
	static string FromUnicode(const QString& qstr)
	{
		QTextCodec* pCodec = QTextCodec::codecForName("gb2312");
		if(!pCodec) return "";			
		QByteArray arr = pCodec->fromUnicode(qstr);
		string cstr = arr.data();
		return cstr;
	}
	// std::string (GBK) -> QString(Unicode)
	static QString ToUnicode(const string& cstr)
	{
		QTextCodec* pCodec = QTextCodec::codecForName("gb2312");
		if(!pCodec) return "";
		/* 注: 如果pCodec為NULL, 則說明你的Qt安裝位置不是預設位置,
		具體解決方法看Qt篇的《常見問題彙總》! */

		QString qstr = pCodec->toUnicode(cstr.c_str(), cstr.length());
		return qstr;
	}
	// QString(Unicode) -> std::string (GBK)
	static string w2a(const QString& qstr)
	{
		return FromUnicode(qstr);
	}

	// std::string (GBK) -> QString(Unicode)
	static QString a2w(const string& cstr)
	{
		return ToUnicode(cstr);
	}
};
#endif