DTK的歷史起源、發展,和簡單入門(精華篇)


簡 述:  DTKdeepin tool kit)全稱是 深度工具套件;是基於 Qt5 開發一整套界面美觀且實用的 UI 圖形庫。

本篇主要儘可能多的講解一下 dtk 的起源於歷史,以及項目壯大後的拆分、現在 dtk 項目的組成和基本含義;以及 dtk 的文檔從無到有,再到現在的極大豐富歷史;最後就是 dtk 的如何快速上手部分。

另一篇中講解 deepin、dde的歷史起源與發展(附deepin所有版本的dde截圖), 可以一覽其近 10 年的變化。

網上關於它的教程比較少,關於歷史的更是基本就沒有,在此補一筆。


一點碎碎念~:

工欲善其事,必先利其器。再知道一點它的演變歷史~?

本文只是個人角度看待 dtk 和 deepin 的演變歷史,其中請教很多的前輩和大佬們(爲了確保時間線的基本確)

本來只是想單寫一篇 dtk 的其實起源的,但隨着本文知識的豐富,向很多的前輩們和大佬們(確保時間線)請教了 dtk、deepin、develop team 的歷史和原源過程中,體會到事物往往不是單一的,且與彼此之間有着千絲萬縷聯繫而又互相獨立,各有特色。本篇的側重點是 dtk 項目的歷史起源、發展過程與現狀、現在的理解和如何快速上手;最後附上部分 dtk 相關的資料文檔。 而關於 deepin && dde && team 的介紹,則單獨成立一篇新的文章

「本文僅代表個人觀點和感知,若有偏差,請以官方文章爲準,也歡迎郵件 [email protected] 幫我指正」;


背景交代:

說來慚愧,初接觸 deepin 是由 v15.11 纔開始的,一開始埋頭着開發 dtk 有許久的一些時間,但對其歷史出身來歷一直比較模糊,於是乎收集和整理一下現存的所有 dtk 的項目、手冊資料,與庫的維護者和最初的庫的開發者,以及公司有着較深資歷前輩們交流,外加上個人和小夥伴們,也都有參與過該庫的維護一段時間後,才得以落筆,梳理成此篇文章(歡迎交流與指正)。


dtk 名稱的理解(易混淆):

  • 其中有幾個容易混淆的名詞,dtkdtkwidgetdtk 項目。

下面僅爲個人理解,按照當前 2020 上半年的階段的項目實際情況理解:

dtk 含義理解: 是一個泛指,需要靈活的在上下文的語義中理解其含義:

  1. dtk 項目(庫) 的集合。 (是一堆倉庫的集合 = dtkwidget + dtkgui + dtkcore + qt5integration…)
  2. 偶也指 dtkwidget 這個倉庫項目(這個倉庫的名稱就叫 dtkwidget
  3. deepin tool kit 是一個深度工具構建集合。
  4. 是能在 deepin(uos) 系統開發應用軟件,使用非 Qt 原生的樣式控件的集合的開發環境
  5. dtk 也作爲構建 deepin 全家桶的基石

DTK 目前分爲三個模塊,dtkcore、dtkgui,dtkwidget,主要功能如下:

項目 功能描述
dtkcore 提供應用程序開發中的工具類,如程序日誌、文件系統監控、格式轉換等工具類
dtkgui 包含了開發圖形用戶界面應用程序所需的功能。主要是控制窗口主題這種外觀性,調色板等信息。
dtkwidget 提供各種dtk基礎控件,方便開發統一風格的應用。

DTK 的歷史起源:

dtk 項目的歷史演變(含名稱):


  • 在 2015 年,開發 deepin v15 版本的時候,因爲開發控制中心(基於 Qt Widgets),開發的過程中抽象出了 dui 控件庫(從控制中心開發起三個月),只有一些通用性的控件,倉庫名稱爲 dui
  • 16 年初,隨後開發其他項目,dui 中加的東西越來越多,也不僅限於 ui 方面的控件,之後就改名爲了 deepin-tool-kit 項目。
  • 17 年底,隨後成爲了 DDE 桌面環境的底層開發庫,封裝了桌面組件和上層應用的通用型窗口、控件、工具類,隨着項目越來越大,編譯也越來越慢,於是拆分爲了 dtkcoredtkwidgetdtkwm(僅三個倉庫),舊的 deepin-tool-kit 倉庫地址處於廢棄狀態。
  • 19 年新增加了 dtkgui 模塊,廢棄了 dtkwm(不可跨平臺,強依賴 X11,因此廢棄),此後分爲 dtkcore、dtkgui、dtkwidget,角色分別對應 Qt core、gui、widgets 模塊。
  • 20 年之後,按照如今的理解爲,dtk = dtkwidget + dtkgui + qt5integration + dtkcore + … 等多個項目的總稱呼

由於 qt5integratioin 項目一直是獨立的,本不算 dtk 項目裏的一員,不過實際上是和 dtk 配套的,故本文算到 dtk 框架中。


樣式變化:

其中隨着時間的變化,界面的 UI 樣式也發生了比較大的變化,當時 v15 版本的控制中心,還在屏幕右側,不透明偏向黑色,到後來的成爲白色偏透明色,在到現在的一個單獨的控制中心(下圖依次爲 deepin v15 早期版本,和 uos v20 的控制中心)。

而 dtk 是屬於繪畫自定義皮膚控件的基礎核心,然後在它的基礎上面做了一次封裝, 封裝了一系列 Dxxxx 開頭的控件(如 DPushButton 等), 然後再由應用開發的同學們,開發出一款款應用,全部使用 dtk 的控件。那樣開發出來的界面,就和系統的風格保持了一致性;而對於 win 系列的軟件,也可以使用 wine(deepin-win) 來在 此 linux 上面運行;而對於第三方的應用軟件,使用 chameleon style 啓動,來保證和系統的風格一致。

下面放圖、使用 dtk 庫 開發出來的控件或者應用,enen… dtk 的樣式就這麼好看,這麼的棒,這裏要多感謝設計師們。ps: 設計師們簡直就是程序開發之友,尤其是使用繪畫控件的時候,可以少修改 50%+ 的代碼或者 bug,且他們也非常好溝通~

  • deepin v15 早期不透明黑色效果:
  • uos/deepin v20 早期透明磨砂效果:

0 -> 1 的誕生 dui:

約 2015 年,起初是創建 dui 項目的,後來才改名爲,deepin-tool-kit ;再後來拆分爲爲多個庫 dtkwidget + qt5integration + 其他;


早先,且所有的 dtk + deepin 的項目,都是在 github 作爲唯一的大本營;由於 0->1 時代,主要是開發構建 dtk 的體系架構,基本沒有什麼文檔的書寫✍️(一個伏筆)


後來有聽到前輩們說,那個時候是的氛圍輕鬆而又歡樂,更多的是一種平等溝通的合作,大家都是開源愛好的志願者,一起做着自己喜歡的事情。羨煞我也~。 嚮往與憧憬那個年代,以及更早的幾年~


deepin-tool-kit 是石器時代:

deepin-tool-kit 最開始,是既沒有文檔,且 api 接口不穩定,容易變化,且設計圖的 UI 樣式也變化較快,導致入門、開發、維護該 dtk 庫都很是困難~。基本是內部開發者靠小夥伴講解,外部開發靠自行閱讀源碼 ;聽說以至於一些社區的小夥伴都看不下去,主動做了一個《Deepin開發指南》(地址已失效)


壯大後拆分 dtk 庫:

前輩們的開發者一起編寫最初的 dtk 庫,隨着近好幾年的變化和發展,後期一定規模了,深思熟慮後,爲更好發展,就決定將對 deepin-tool-kit 倉庫進行拆分(2017 年左右): 詳見 issues #8

  • dtkcore: 由 dtkbase/dtkutil/dtksettings 合併進入
  • dtkwidget: 由 dtkwidget/dtksettings 構成
  • dtkwm: 處理窗口識別庫/xcb功能, 供截圖、錄屏、系統監視器使用
  • qtwebkit: 封裝chroium,提高CEF/WebEngine兼容接口

昂~ ,爲了代碼的健壯性發展,與方便後期的可維護性


dtk 的口口相傳時代:

隨着上一個時代已經過去了,dtk 的主體框架和 api 都趨向於穩定;且有了部分中文文檔,(是中文文檔!!! 雞凍٩(๑>◡<๑)۶!!!);此時也基本對內部和外部的研發都已經友好了很多。


此階段應該是 deepin 15.11 (恩,至今都是一個經典的版本,後來發現該發版本打磨和維護了近 5 年,很棒的一個版本)已經發布了出來了,開始研發 v20 階段了。

不過此階段,新的庫的維護者學習 dtk 的方法,依舊是口口相傳,手把手的教你一行一行的寫代碼(像一個大哥哥一樣~);畢竟使用的最新的接口,還沒來得及更新到文檔之中,且容易有變化,舊的接口就穩定得多。此階段 dtk 的研發就是內部靠口口相傳,外部研發靠部分文檔+@戳你一下,加雙方都看源碼,來完成彼此的合作 (有事覺得有和其他開發者一起互動的感覺也很棒~)


這裏說一個小的插曲:

當我初次開始接觸 dtk 庫的維護時候,學習方式也是口口相傳。

記得剛來,就來負責 dtk 的開發與維護,初接觸的一週,都不知到該如何敲下手,一行都憋不出來;擔心自己涼了,然後網上搜了搜 dtk 關鍵字,我的媽耶,連一個文檔都沒得,心裏下意識的覺着涼透了,想自學都沒得門路,此刻只想點一碗傷心涼粉安慰一下自己;


後那一週,是我的負責人,搬着一個小板凳,坐在我旁邊,一行一行的敲着我看的,我才得以快速上手的。後面就想着,一定要儘快的摸清楚 dtk 的繪畫自定義皮膚的控件的架構和原理。後面寫幾篇 dtk 分析,幫助後面小白入門,盡我所能幫助,爲它的發展添一塊瓦(所幸,在延期了幾個月後,將其寫出來且發表了🤣🤣)


至今回憶起來,都感覺有點不好意思,但是那會卻又是無可奈何。至今都十分奇怪,爲何他的耐心如此只好,大概君子無慍色,就是這種讚譽吧~ (尤其是每天都有很多人找他的情況下,巨忙);那個時候,也不只是我,還有很多新人也是被手把手的教會 着如何開發 dtk。那會看到,大佬很忙碌,但是又不得不請教他的時候,就覺得很殘忍~(尤其是偶爾還打擾週末休息)


dtk 的文檔時代:

約 2019 年末,2020 年初~,deepin 和 team 成長的很多,收穫了也很多,和外部一起合力成立一個更大的公司(統信軟件),來更好的整合資源與預計前景規劃 ~ ;


隨着 uos v20 sp1 和 deepin v20 beta 的先後在今年發佈,以及 deepin 也收穫了金錢和其他資源的支持,反手就是一個投入更多的財力人力和其他資源來研發新的 v20 版本。以獲得更好的回報~,然後良性循環。

咳咳,好像有點跑題了哦~ 不過落實到和 dtk 相關的就是,有一段時間,一羣研發們,瘋狂熬夜加班,給補充 dtk 文檔(驗證了伏筆 🐶),使用 Doxygen 來生成文檔(大部分都是中文的哦~)。

有關 dtk 的 api 使用說明,可以參考:https://linuxdeepin.github.io/dtk

但不知道爲什麼會顯示上次更新的時間還是 20219-07-10,實際後面有補充很多的~。此階段外部開發,可以很大一個程度來依靠此文檔。且 dtk 的每一個 api 的解釋都是寫在函數的上面的註釋地方。直接使用 IDE 的代碼提示 + 源碼 api 的註釋,可以更加高效的開發。

現階段就是內部靠: 視頻培訓 + 手把手帶 + Doxygen 文檔 + 企業wx羣 + 翻看源碼 + 組員幫助

外部靠: 回看視頻培訓 + Doxygen 文檔 + 企業wx羣@dtk研發來講解 + 翻看源碼 + 組員幫助


不過說講真,dtk 學習,最快最有效的,還是自行翻閱 Qt & dtk 的源碼;和自己嘗試獨立寫出一個自繪 dtk 控件皮膚樣式來的快。且學習 qt/ c++ 的人,一般自學能力都真的很強,其中 dtk 的項目都已經在 github 上面同步開源了:linuxdeepin, 其中社區版的分支是和內部的 gitlab 是保持同步的。


dtk 庫的快速入門:


如今 dtk 項目的構成(2020-05):

目前,dtk 項目的各個倉庫之間的關係如下: 現在基本是這個格局了(圖片基本準確),說一下個人的 dtk 和它們之間的理解:

實際開發過程中,你是不需要掌握這麼多的庫的,也不會需要你一個人同時維護這麼多的庫,且同時有一些庫,是很少被改動的。並不是經常需要提交。

這裏再次說一下 dtk 的含義:

dtk = dtk項目 = 多個倉庫集合 = dtkwidget + dtkgui + qt5integration + dtkcore + …

關於 dtk 的庫,在外網 github 和內網 gitlab 上面是保持一致的,對應的分支是時刻同步的; 故從內網或者外網下載學習,都是這麼開心和輕鬆。對於 dtk 的學習使用,主要掌握以下兩個倉庫 qt5integration 、 dtkwidget 的學習和使用,其中主要是在工作和興趣開發中的書寫代碼的主要陣地。


簡述 dtk 的各倉庫作用:

下面以一種清晰、簡陋的理解,全局的概括的講解 qt5integrationdtkwidgetdtkgui這三個比較常用的倉庫(若是第一次接觸的話,看完了後,你還記得每一個部分對應的什麼麼?😶😶)


qt5integration:
  • qt5integration 項目結構組成:

    • 其主要是由如下幾個子部分組成

      • iconengines: DIcon 插件相關,方便直接提取項目中 .svg 圖片資源,常用如:

        case SP_DialogResetButton:
                    icon = QIcon::fromTheme(QLatin1String("edit-clear"));
        
      • imageformats: 相當於實現 DIcon::fromTheme() 的功能函數

      • qt5deepintheme-plugin: 一些基礎的圖片 svg 資源存儲地方,重點爲 Resources 文件

      • styleplugins: deepin 的自定義 chameleon style 樣式插件,基本所有 Dxxxxx 控件,都是在 chameleon.h chameleon.cpp 這兩個裏面實現的(也是我們最主要修改 code 的地方)

      • styles: 測試例子,也是 main.cpp 的函數入口

    • 繪畫 dtk 控件的皮膚樣式,主要是 chameleon 樣式,其中主要的主要效果如下


dtkwidget:

  • dtkwidget 項目結構組成:
    • dtkwidget 其主要是由如下幾個子部分組成
      • examples: 裏面的 main.cpp 是整個程序的入口,通常在這裏測試
      • src: dtk 的自定義 Dxxxx 控件,都存放於其下的 widgets 下, 如 darrowbutton.hdarrowlinedrawer.cppddialog.cppdslider.cpp 這些等(我們也通常在這裏直接修改 Dxxx.h 和 Dxxx.cpp 文件),是 dtk 開發的主戰場。
      • tools: 工具相關、可不管
    • 繪畫 dtk 自定義的控件的皮膚樣式,其中主要的主要效果如下


dtkgui:

  • dtkgui 項目結構組成:

    • 這個就是前面說的,現在很少需要修改,但是偶爾要會使用的倉庫。比如設計師修改了他們的基礎顏色的 Color 的 rgb 數值,調整了一下透明度等,他們給的參數,一般都是在這裏來實現,將具體的顏色數值與 Qt 子定義的枚舉對應起來。

    • 其中主要是修改 src-dguiapplicationhelper.cpp 該文件,一旦修改,所有其值,所有人的效果都會發生改變,謹慎。


下載地址:

QtExamples

歡迎 star 和 fork 這個系列的 qt/dtk 學習,附學習由淺入深的目錄。


資料手冊 && 故地址遺蹟:

資料手冊:

  • linuxdeepin: deepin 在 github 的開源地址; 大部分項目均已開源(含完整 dtk),且和內部保持一致,無論是想要學習 dtk 的開發,還是研究一些應用軟件的使用,提交 pr,均可以在此 github 這個交友網站找到你的想要的資源
  • dtk api 文檔 :有關 dtk 的 api 中文使用說明;更多註釋,請閱源碼註釋
  • dtk 重繪控件的原理解析:其中第五章節,爲 dtk 的源碼架構分析、以及入門和開發,一些理解和實戰
  • DTK重繪自定義需求控件: 從 0 立創造一個非 Qt 原生控件,且自定義其控件皮膚(系列有三篇)
  • DTK常用和測試代碼片:dtk 的一些開發常用、和測試的代碼片
  • 使用 DTK 開發,D 開頭的宏和命名空間的使用:(早期)關於 dtk 宏的使用
  • DDE.dot :dtk 各倉庫之間的聯繫圖
  • deepin 官網:官網的發佈社區版 deepin,也是一個獲取的用戶交流論壇
  • dtk 和 qt 源碼 + 註釋(最佳)

鏡像下載:


參考 && 感謝:

在探究 dtk 的歷史中,搜尋着一些並不多的網絡博客文章,和前輩們、大佬們的溝通,口口相傳,文中有使用他們的素材或者博客片段,或者 dtk 的相關介紹、使用技巧鏈接,表示好感和謝謝 Thanks♪(・ω・)ノ zccrsshulehualetBLumiaxmulijustforlxz …等

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章