[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這個class宣告一個private variable,其被賦予的值就是上面提到的count。

private:
    int m_count{};

為了讓QML端可以方便存取這個variable,下面這一段是關鍵,主要是透過Q_PROPERTY這個macro定義欲存取的方式。

    Q_PROPERTY(int count READ getCount WRITE setCount NOTIFY countChanged)

這一行的說明是,有一個名為count的property,它的data type是int,對於count這個property,提供了READ、WRITE、NOTIFY三個功能,而這三個功能分別對應的function就是getCount、setCount、countChanged。前面兩個應該容易理解,第三個其實就是一個signal,所以宣告如下。

signals:
    void countChanged();

getCount()和setCount()這兩個function都很單純,就是對m_count的讀取和寫入,唯一要注意的就是在setCount()裡,當m_count值有所改變時,需要發送countChanged()這個signal,如此一來,QML端才能在不建立Connections的情況下,能收到該NOTIFY。

Qt QML部分

UI主要是顯示m_count的值,在前面C++的部分提到該變數在QML裡的存取設定,因為該變數屬於ctrl這個物件,變數名稱也已經透過設定時宣告為count,所以在QML裡對該變數的存取就是對於ctrl.count進行操作即可。以下面這段程式碼為例,就是將文字顯示(text)的部分,跟ctrl.count的值做一個Binding的動作。當C++物件(ctrl)的成員變數m_count(count)改變時(發出NOTIFY),就會獲取最新的值。如此一來,就不需要在QML建立Connections去做對應的動作。

    Text {
        id: txtCount
        width: 100
        height: 30
        anchors.centerIn: parent
        text: "Current count is " + ctrl.count
    }

上面這一段顯示的是針對該變數的讀取(READ)部分,而寫入(WRTIE的部分),就直接assign值給該變數即可,這一部分就實作在當上方Button點擊時的動作。

        onClicked: {
            ctrl.count = 3;
        }

執行結果

Read more

聽說 AI 都能寫程式了,那我還需要學程式語言嗎?

自從ChatGPT橫空問世,人們在獲取知識的方式,發生很大的改變。很多既有的知識或疑問,可以不用在透過Google等搜尋引擎,搭配正確的關鍵字,從中找到相符的結果。 有了ChatGPT,只要用聊天的方式,用人類自然語言詢問,就能在短時間統整出邏輯清晰且條理分明的結果。不論是知識的學習、文章的統整、甚至程式的撰寫,都能透過AI工具快速產生具有一定水準的成品。 那,既然AI都能幫忙寫程式,而且也寫得不錯,我還需要學習程式語言嗎?答案是「肯定」的。 AI是輔助工具,不是程式設計師 沒錯!AI能寫出不錯的程式碼,但如果你本身不懂程式設計,你如何判斷它寫出的結果,是否符合你所想要的?對懂程式的人來說,他會比較清楚該如何對AI工具「下指令」,程式設計師可以利用AI工具的輔助,節省掉實際開發與除錯的時間。 再者,要寫出一個可以應用的程式,並非如此簡單。從一開始的需求分析,到架構設計、模組化元件、單元測試等等,絕對不是透過跟AI工具講三兩句話就能產出的。 AI是透過背後龐大資料與分析模型取產生我們想要的結果,意即,它做不到「無中生有」。相較於AI,人類的優勢在於「創造」。AI工具的出現與

By 三寶爸工程師

[程式教育] 該學哪一種程式語言才好?你必須先了解程式語言的7個應用領域

之前一再強調,學習程式語言不完全是為了將來當工程師而學的。但對初學者來說,在這麼多種程式語言中,究竟要選哪一種程式語言做學習呢? 在這之前,我們要先了解,程式語言的應用,大概有哪些領域。先看看自己對哪一個領域有興趣,不妨從該領域下手,學習一種該領域會用到的程式語言,並透過學習去完成一個小作品。 以下是依照應用領域的分類,列出該領域的幾個主要採用的程式語言。 一、網頁開發 (Web Development) 網頁(網站)開發是最普遍的一種應用,幾乎每個人每天會接觸到的,都脫離不了網頁開發的相關產品。在這裡我要特別說明,「開發」網站跟「架設」網站是兩回事,如果只是要「架設」網站,那是可以不需要學會寫程式就能做到的,因為有太多現成工具就可以達到「架設」網站這件事。關於「架設」網站的工具,我們有機會再另外寫一篇文章說明。但不論如何,網頁(網站)的基本運作原理還是要懂的。 網頁開發的部分,一般來說還區分「前端」和「後端」的開發與維護。

By 三寶爸工程師

[程式教育] 我未來不想當程式設計師,那還需要學程式語言嗎?

這個問題,最中肯又八股的答案當然是「不一定,但有學比較好」。如果問我,我肯定是建議你「最好要學」。 我換個問題,我未來不想當英文老師,那我需要學英文嗎?答案應該很清楚了! 你可能會說「不一樣啊!」請你仔細想想,學習「語言」跟「程式語言」的目的,我在 [程式教育] 學習程式語言的Why and How 這篇文章內有提到,兩者的目的一樣都在「溝通」,只是對象不同。 以目前AI發展的速度,也許不久的將來,「語言」也不需要學習了也說不定。屆時,「程式語言」的角色可能反而更吃重。並不是說你要學會用程式語言來開發軟體,而是透過學習程式語言吸取基本知識和延伸的能力。以下我列出五點,學習程式語言所能帶來的價值。 一、提升問題解決能力與創造力 學習程式設計可以培養邏輯思維和系統化解決問題的能力。這些技能在各種職業中都是非常寶貴的,無論是管理、行銷、工程還是醫療領域,遇到複雜問題時,能夠分解問題並系統地找到解決方案是非常重要的。 程式設計是一種創造性的活動,讓你能夠實現自己的想法和項目。

By 三寶爸工程師