根據PC端telegram原始碼提取出來的Qt文字顯示程式碼
最近在做一個聊天軟體,是用Qt開發,訊息顯示是一個比較重要的部分,經過幾次嘗試發現Qt的預設控制元件都沒有現成的能夠實現複製、選中效果、連結、顯示錶情和圖片等的控制元件,後面發現telegram的PC端也是用Qt寫的,就下載了它的原始碼研究了一下它們的訊息顯示部分,並單獨把這部分提取出來了,在這裡分享一下。
Telegram的方法大概是這樣的:
1.flatlabel是顯示訊息的控制元件,繼承自他們自己封裝的twidget、clickhander(為實現url點選時用);
2.初始化的style::flatlabel 這裡麵包含了很多顯示文字的預設樣式,字型大小、顏色等,我在提取的時候有些簡化掉了;
3.Flatlabel有個Text類,這個是最重要的,文字解析和繪製都在這個類裡面實現,通過settext方法會把文字傳給Text去管理;
4.Text類同TextParser類對文字進行解析,把文字解析成各種block(比較重要的兩個函式parseCurrentChar();parseEmojiFromCurrent(););
5.解析完成繪製的時候通過TextPainter類實現,通過draw和drawline函式,把文字繪製在QWidget上,繪製的很多樣式顏色啥的都可以在style::flatlabel裡設定,他們還封裝了style::font和style::color來管理這些樣式;
提取的時候程式碼被我改的有點亂,有興趣的可以自己整理一下
展示一下我提取出來後實現的效果:
這是在專案中實現的
編譯的時候要注意一下:
1.我安裝的是Qt5.7.1版本, msvc32編譯器,安裝vs2015,win7;
2.編譯前,先把QtCore、QtWiget、QtGui這三個標頭檔案路徑下面的private資料夾
(Qt\Qt5.7.1_vs32\5.7\msvc2015\include\QtWidgets\5.7.1\QtWidgets\private、Qt\Qt5.7.1_vs32\5.7\msvc2015\include\QtWidgets\5.7.1\QtWidgets\private、Qt\Qt5.7.1_vs32\5.7\msvc2015\include\QtWidgets\5.7.1\QtWidgets\private)複製到QtCore、QtWiget、QtGui這三個路徑下面,不然會編譯出錯