QML和C 混合程式設計 (一)

2021-10-24 16:34:10 字數 2482 閱讀 4827

本教程介紹在c++應用程式中擴充套件使用qml。著重介紹了qml的核心特性:如屬性、訊號和槽。還有通過外掛程式來銷毀這些擴充套件。

翻譯來自qt的官方的英文教程。

qt qml 提供了一些api,使得可以通過c++進行擴充套件。你可以自行書寫這些擴充套件,來增加到你自己的qml型別中。簡而言之,qml的型別可以通過c++進行擴充套件。

該部分的內容可詳細參考《integrating qml and c++》,該文件下的兩**目錄,你可能會更喜歡:

1、 exposing attributes of c++ classes to qml

2、defining qml types from c++.

教程一的執行效果如下:

下面介紹如何來建立乙個qml的新型別。

通常我們會遇到這樣的乙個任務:

擴充套件乙個qml的新型別,而且該型別支援自定義的操作函式。

例如,該型別用來操作一些特殊的資料模型,或者自定義的影象型別,或者系統操作型別如網路通訊的操作。

我們先從建立乙個簡單的型別,名為「piechart」開始吧。

該型別包含兩個屬性: 名稱(name)、顏色(color)

我們將該型別指定乙個命名空間稱為「chart」, 且版本號定義為v1.0。

具體**定義如下:

import charts 1.0

piechart

我們需要定義乙個c++類來概括這個piechart型別以及該型別的兩個屬性。因為qml的擴充套件需要用到qt的meta object system,所以我們需要:

1、繼承qobject

2、通過q_property marco 來宣告該屬性。

這裡我們在piechart.h 中定義

#include

#include

class

piechart

:public qquickpainteditem

;

該型別繼承了qquickpainteditem ,因為我們需要過載該qquickpainteditem ::paint()。如果型別僅僅是為了資料處理,而不是圖形。那麼可以簡單的繼承自qobject.如果我們僅僅是為了擴充套件qobject-based 類的功能函式,納悶我們繼承qobject就可以了。如果我們需要建立乙個可檢視形項,但是該可檢視形項不需要自定義,那麼我們可以繼承自qquickitem.

在piechart.cpp中簡單的實現了 m_name 和m_color 的屬性值,然後重寫了paint()函式來繪製pie 圖形。而且關閉了 qgraphicsitem::itemhasnocontents 的標誌來使能繪製圖形。

piechart::

piechart

(qquickitem *parent)

:qquickpainteditem

(parent)..

.void piechart::

paint

(qpainter *painter)

import charts 1.0

import qtquick 2.0

item

text

text: apiechart.name}}

注意到儘管color 的定義是乙個字串,它是自動通過qcolor 物件來設定的。

main.cpp 函式如下:

#include

"piechart.h"

#include

#include

intmain

(int argc,

char

*ar**)

最後,我們來書寫工程檔案.pro 來關聯相關檔案和庫

qt +

= qml quick

headers +

= piechart.h

sources +

= piechart.cpp \

main.cpp

resources +

= chapter1-basics.qrc

destpath = $$[qt_install_examples]

/qml/tutorials/extending-qml/chapter1-basics

target.path = $$destpath

qml.files =

*.qml

qml.path = $$destpath

installs +

= target qml

本篇翻譯子qt官方教程

tutorials/extending-qml/chapter1-basics/

C 和QML混合程式設計 下 C 中呼叫QML

c 中呼叫qml,主要通過呼叫qml物件成員,方法以及與qml訊號關聯 item 為了能夠在c 中訪問qml定義的成員變數somevalue,可以使用qqmlproperty的read 和write qobject setproperty 和qobject property 在main.cpp中 q...

QML實戰筆記4 QML和C 混合程式設計

在qml中呼叫c 1.首先建立c 類 如果想在qml中使用c 列舉,可以使用q enums巨集將該列舉註冊到元物件系統中。如 enum color q enums color 如果想通過元物件系統訪問c 類的屬性,可以使用q property。如 q property qcolor color re...

Qt c 與QML混合程式設計

1.在qml中使用c 類和物件 前提條件 從qobject類或其派生類繼承。使用qobject巨集 這是為了讓類能進入元物件系統 meta object system 在其中才能讓乙個類的方法或屬效能通過字串的形式呼叫。具有什麼樣的特徵的屬性或方法才能被qml訪問呢?1 訊號,槽 不多說,這個都知道...