Visual Studio + Qt SDK 的 Dockerfile

這篇是延續《Windows 的 Qt SDK Dockerfile [202002]》,來記錄一下到底要怎樣建置出一個可以拿來建置 Visual Studio + Qt VS Tools 專案的 Docker 容器。

Visual Studio 的 Docker 處理方法,基本上是延續之前《Visual C++ 2017 的 Docker 建置環境》、只做版本的更新。

以要安裝 Visual Studio 2019 Build Tools 的話,主要就是要在: Dockerfile 中加入:

閱讀更多»

Windows 的 Qt SDK Dockerfile [202002]

Heresy 從去年年初開始玩 Gitlab CI/CD 一段時間後,就開始試著把建置環境移動到 Docker(官網)上。在 Linux 上的問題不算大,但是在 Windows 上卻常常碰到一些問題(參考一參考二);前一陣子,甚至因為微軟自己的安全性更新,搞到整個不能用(參考)…

雖然說零零星星有些問題,但是大致上都還是可以使用的;在可以正常運作的情況下,感覺也算是相當地方便~

不過,對 Heresy 來說,這部分還有一個很大的問題,就是 Qt SDK(官網)。

閱讀更多»

Qt 安裝腳本更新

之前有寫了一篇《在 Windows 命令提示字元安裝 Qt SDK》,大概紀錄了一下,在沒有圖形介面的環境下,使用腳本來安裝 Qt SDK 的方法。

腳本在當時是沒問題的,但是沒想到前幾天要用的時候,卻發現又無法使用了…

網路上找了一下資料,發現似乎是在過沒幾天、Qt 把安裝程式更新到 3.1.x 後,又改了一些東西造成的。(拜託顧一下相容性啊…)

找到的資料是 StackOverflow 上的《Bypassing “User Data Collection" screen》這個回應。根據他的說法,這次改版主要是加入了「User Data Collection」的畫面,另外在選擇元件的部分也多了分類的選擇。

也因此,腳本要針對這兩個變化,做出修改:

閱讀更多»

在 Windows 命令提示字元安裝 Qt SDK

這篇算是《GitLab CI + Windows Docker 的一些紀錄》的延伸。由於 Heresy 這邊的開發專案有用到 Qt SDK(官網),所以在建置用的 Docker 容器裡面,也需要安裝 Qt 的 SDK。

但是由於 Qt 現在的線上安裝程式也都是以圖形介面為主,並在圖形介面中選擇要安裝那些套件;所以要怎麼在沒有圖形介面的 Docker 內安裝,就需要稍微研究一下了。

在找了一些資料後,可以知道 Qt 的安裝程式框架(Qt Installer Framework、QTIFW、官方文件)是有支援使用腳本(script)來做控制的!(官方文件

而在網路上,也可以找到使用這樣的機制,來自動安裝  Qt 的腳本範例。Heresy 這邊是參考《How can I install Qt 5.2.1 from the command line in Cygwin?》的例子。

閱讀更多»

在 QTableView 內使用 QItemDelegate 來畫按鈕

QTableView 是 Qt 的一個 model / view 的表格元件(官方文件),如果搭配 QAbstractItemModel 來使用的話,其實還算簡單好用,甚至可以很簡單地做到多個表格間的資料同步。

而如果需要表格內不只想要顯示文字、而希望可以使用一般的 QWidget 的話呢,他其實也有提供 setIndexWidget() 這個函式(文件),可以針對每一個欄位,來設定要使用的 widget。

或者另一個選擇,就是放棄使用 QAbstractItemModel,改用 QTableWidget參考),也是一個方法。

閱讀更多»

Qt OpenGL Font 的使用限制

這篇是之前《使用 QGraphicsScene 繪製 widget、產生 OpenGL Texture》和《使用 QGraphicsScene 繪製 widget、產生 OpenGL Texture:續》這兩篇的延伸,主要是針對 Qt OpenGL 裡面,字型的問題做一些研究紀錄。

老實說,最初一直以為 Qt 應該都處理掉了,應該可以一下就弄完,結果沒想到牽扯的問題很多,一堆問題還是無解…

首先,這邊最基本的需求,就是使用 QOpenGLPaintDevice,透過 QGraphicsScene 把 Qt 的圖形介面(QWidget)以 offscreen 的形式、畫成一個 OpenGL Texture。

而現在碰到的主要問題,則是兩個部分:

  • 文字大小超過一定程度,會變成黑框
  • 部分地方的繪製效果不一致
  • High DPI 設定造成顯示結果與預期不同

閱讀更多»

使用 QGraphicsScene 繪製 widget、產生 OpenGL Texture:續

這篇基本上是之前《使用 QGraphicsScene 繪製 widget、產生 OpenGL Texture》一文的後續。

在當時,Heresy 有提過,如果真的用 QOpenGLPaintDevice 來給 QGraphicsScene 繪製到 Frame Buffer Object 上的話,會造成文字的破碎、無法識別的狀況;而 Heresy 當時的解法,是暫時放棄 OpenGL 繪圖,而讓 QGraphicsScene 先畫到 QImage 上(raster)、然後再把它傳到顯示當作為 OpenGL 的 texture。

理論上,這個方法的確是可行的,但是實際上,在後來使用的時候,卻發現:

當介面稍微多一些東西的時候,用 QGraphicsScene 把圖形介面畫在 QImage 上要花超過 150ms… orz

如果是一般視窗環境,或許還算勉強可以接受,但是在 VR 環境下,這樣連 10FPS 都到不了的速度,是完全無法被當作「堪用」的…

閱讀更多»

Qt OpenGL 的一些使用問題

這一篇,算是自己點單紀錄一下,目前使用 Qt 5 來開發 OpenGL 程式時,碰到的一些問題吧…

基本上,Heresy 對於整個 Qt OpenGL 的使用架構不算非常熟,也是邊寫邊摸,所以本文也不盡然正確,很大的機會應該有不少地方是使用錯誤…不過,基本上就算記錄下來,給自己以後參考用了。

首先,Qt 5 基本上應該算是已經深度整合 OpenGL/OpenGL ES 了~預設下載預先編譯好的版本,都有支援 OpenGL、而不用另外自行編譯了。

而他的主要文件,應該可以從《OpenGL and OpenGL ES Integration》這邊開始看。

閱讀更多»

使用 QGraphicsScene 繪製 widget、產生 OpenGL Texture

從去年開始,Heresy 就有在試著用 Qt 搭配 OpenVR,開發支援 SteamVR 的虛擬實境的程式。當時在寫的時候,一部分是參考 GitHub 上的「QVRViewer」這個專案(連結),也算是成功地把 Qt OpenGL(官網)的框架,成功地和 OpenVR 整合到一定程度了。

而接下來,則是希望可以在虛擬實境的環境裡面,顯示圖形介面的部分。這部分,則是參考了 OpenVR 的「helloworldoverlay」這個範例(連結);在它裡面的「openvroverlaycontroller.cpp」這個檔案(連結)就有把 Qt 的 Widget 繪製成 OpenGL Texture、並手動傳送滑鼠事件進去的操作方法。

首先,他這邊的概念,就是透過 Qt Graphics View Framework 的框架,來繪製 QWidget;而和一般使用 QGraphicsScene 時不同的地方,是這邊不會去使用 QGraphicsView 來做呈現,而是特別去設定要使用的 QPainter,來決定要畫到哪裡。

閱讀更多»

支援科學記號的 QSpinBox

Qt 本身有提供 QDoubleSpinBox 這個元件(官網),可以提供使用者來輸入浮點數(小數),不過他基本上並不支援「科學記號」(科學記數法、Scientific notation、維基百科),所以如果要輸入極大的數字、或是相當接近 0 的小數時,都會相當麻煩。

查了一下,Qt 似乎沒有特別針對科學記號設計類似的元件,所以如果有這樣的需求,就得自己來了。

針對這個問題,網路上可以找到一些討論,也有一些實作,但是看起來好像都很複雜?

後來 Heresy 自己玩了一下,發現其實只要繼承 QDoubleSpinBox 並搭配 QDoubleValidator官網)的話,其實可以相對簡單地建立出一個支援科學記號的版本。

下面這個 QScientificSpinBox,就是一個簡單的實作:

閱讀更多»