三寶爸工程師

Qt for Python

[Qt for Python] PySide 與 PyQt 的選擇

Python是目前全世界最多人使用的程式語言,也是應用範圍最廣的程式語言之一。除了當今最火紅的AI人工智慧領域外,舉凡網頁應用程式、桌面應用程式,甚至手機應用程式,都能看到Python的蹤跡。 在桌面應用程式的部分,Python能搭配的GUI框架有非常多種選擇,其中又以Qt這套跨平台GUI開發框架最為廣為人知。然而,Qt for Python卻有著複雜的歷史,導致目前市面上是有兩套GUI套件可供開發者選擇,分別是PySide和PyQt。如果你對於相關歷史有興趣,請參考下面這部影片。 該如何選擇? 那這兩個該如何選擇呢?這不是什麼大人跟小孩的選擇,直接說我全都要這麼簡單的。先講結論,兩者都可以選擇,但我會建議選擇PySide。下面的篇幅從三個層面來簡單分析,說明為何我這樣建議的理由。 第一、套件提供來源 PySide是由Qt官方(The Qt Company)所提供的Python for Qt的套件,雖然有一陣子它的套件維護和更新不及於PyQt,但隨著Python越來越多人使用的情況下,Qt官方對Python的支援程度,也跟著其主要的C++函式庫的腳步,持續著更新及維護。所

By 三寶爸工程師

Qt Quick/QML

[Qt QML] 如何在QML裡存取C++物件的類別成員

在之前的文章我們介紹了在QML如何呼叫C++的class function,那如果我們要直接存取類別成員時,該怎麼做呢?當然我們可以直接透過呼叫class function去做到這件事,但是如果該成員變數的值有所變動時,而這個值是我們需要在UI即時呈現變化的,那該如何處理呢?簡單來說,就是再結合上一篇所介紹的,在QML裡建立與C++物件的connections,當該變數的值有所改變時,發出一個signal,其連接的slot function再去做對應的動作。但以實作上來看,可以有較簡潔的寫法,從程式碼上看不到有任何地方建立connections,但實際上概念就是透過connections去達成的,我們透過以下的簡單範例來解釋。 我們一樣先從畫面的解說和功能描述開始,如下圖,視窗中央有一段文字顯示目前count這個變數的值。另外有兩個Button,上方Button的功能是點擊後將count的值設定為3,而下方的則是將ㄙcount加10。一旦count的值改變,中央那段文字所看到的數字也會跟著改變。 Qt C++部分 我們一樣延續之前的程式碼進行修改,首先,在Controller這

By 三寶爸工程師

Qt Quick/QML

[Qt QML] 如何在QML裡建立與C++物件的connections

上一篇我們介紹了在QML中如何呼叫C++ class functions,這一篇我們講解一下,反過來如何從C++呼叫QML裡的JavaScript functions。不過這裡我要特別強調,實作上我們確實可以從C++這一層來呼叫QML裡的function,但實際上,以架構上的角度,並不建議如此設計。因為以架構上來說,UI這一層使用QML撰寫的程式碼只會有UI的相關邏輯,譬如說畫面流程的轉換,它不應該被屬於bussiness logic的C++這一層來操控。那應該怎麼做呢?最好是採用Qt裡的signal and slot機制來達到需要的結果,也就是說,以bussiness logic的角度,它只要在某事件發生時將signal發出即可,至於要接收該signal的物件就自行將connection建立起來,然後定義對應的動作(slot function)。 OK,既然在設計上不建議從C++呼叫QML裡的JavaScript functions,所以我覺得也沒有必要介紹該實作方式了。所以接下來就給一個簡單的範例程式,敘述如何在QML裡建立的與C++物件的connections。基於上一篇文章的

By 三寶爸工程師

Qt Quick/QML

[Qt QML] 如何呼叫C++ class functions

在開發Qt應用程式時,不論其目標執行環境是Desktop (Windows/macOS/Linux) 或 embedded,我都建議採用QML來開發GUI的部分。其主要的原因之一是,在程式架構上可以很容易地把畫面跟商業邏輯的部分拆開。如此一來,在UI改版的情況下,幾乎不需要修改到商業邏輯的部分,這提高了在開發及維護上的彈性和效率。 這邊提供一個簡單的範例程式,來示範一下如何從以QML撰寫的GUI來呼叫C++層所定義的class function。先講解一下畫面的部分(如下圖),視窗中間有一個按鈕,當按鈕被點擊時,等待三秒後將應用程式關閉。這邊提到的「等待三秒將應用程式關閉」,其實使用QML撰寫就可以很快速的實作出來,但因為這一篇文章主要是要示範如何呼叫C++的class function,所以我們用C++來實作這個功能。 Qt C++部分 首先,依據MVC的設計概念,我習慣會在C++這邊定義一個class名為Controller,它就是負責實作上面提到的商業邏輯部分,而UI跟商業邏輯間的溝通和交互,主要都是透過這個類別來進行。我們在Controller裡定義了一個public

By 三寶爸工程師

初學者必讀

[初學者必讀] 在開始學習之前,你應該了解的三件事

1 動機與目的 其實學習任何新事物都一樣,首先你得搞清楚你為何學習(動機),以程式語言這個領域來說,要學習哪一個程式語言並非你首先就要思考或決定的問題。一定有某個事件觸發了你想要學習的想法,這就是所謂的動機,足夠強烈的動機才可以讓自己在學習過程有所衝勁。如果你只是單純因為聽說程式語言很重要,但你不知道學了要幹嘛?那講難聽點也只是跟風,學習過程就很容易遭受挫折而放棄。 試問一下自己,覺得自己的英文能力好嗎?回想一下你在求學階段,之所以學英文是為了什麼?大多數人的回答肯定都是為了考試,對吧!?以這樣的動機,自然學習起來就會感受到痛苦多於成就感,當然,錯誤的學習方式又是另一個問題,不在此多加討論。 搞清楚學習動機後,再來你還得思考一下,你在學習後想要得到什麼樣的結果(目的),這就牽涉到你要往哪個方向學習了。舉例來說,有人想要學習開發手機App,那就得先確認你要針對Android手機還是iPhone手機。不過,也有些技術是可以在Android和iPhone裝置都可以運作的,我們之後也會花點篇幅來介紹這個部分。 再舉個例子,有些人對網站技術有興趣,想要自己架設網站,那就得先搞清楚,架設網

By 三寶爸工程師

初學者必讀

[初學者必讀] 為何我推薦QML作為第一個學習的程式語言

什麼是QML? 對很多程式語言的初學者來說,第一個遇到的問題肯定都是「究竟要從哪一個程式語言開始學起呢? 」。我只能說,要依照你的學習目標而定,這個問題沒有一定的標準答案,想學習開發手機應用程式跟想學習開發網頁應用程式的就不相同,就連開發手機影用程式也區分成是針對Android或iOS而有所不同。 我知道很多人會推薦Python作為第一個學習的語言,原因不外乎是語法簡單、應用領域廣,我個人並不否定這個說法。但你可曾想過,是否有其他語言也有類似的特點呢?答案當然是肯定的,我接下來一系列教學所使用的程式語言,QML,就是其中之一。 QML是 Qt Markup Language的縮寫,Qt(發音同Cute)是一個基於C++的開發框架,而QML是Qt所設計來撰寫GUI(圖形使用者介面)的一個程式語言,它是屬於QtQuick模組的其中一環,QtQuick模組也提供了相當多基於QML的GUI元件,方便於應用程式的GUI開發。(註:何謂框架、模組?我之後會再寫一篇文章來解釋。) QML有哪裡好?跟Python比又好在哪裡? 其實程式語言沒有所謂的好壞,根本上是無從比較的,端看你要用這個

By 三寶爸工程師