1. 程式人生 > >如何在QML中呼叫C++的方法並接收C++的訊號

如何在QML中呼叫C++的方法並接收C++的訊號

在QML中呼叫c++方法並接收訊號

繼續上一篇的內容使用C++建立新的QML型別,接下來我們在PieChart 這個類中新增一個函式"clearChart()" 和一個訊號"chartCleared",這樣在app.qml中就可以像下面一樣呼叫這個函式,並接收這個訊號了:

import Charts 1.0
import QtQuick 1.0
 
 Item {
     width: 300; height: 200
 
     PieChart {
         id: aPieChart
         anchors.centerIn: parent
         width: 100; height: 100
         color: "red"
 
         onChartCleared: console.log("The chart has been cleared")
     }
 
     MouseArea {
         anchors.fill: parent
         onClicked: aPieChart.clearChart()
     }
 
     Text {
         anchors { bottom: parent.bottom; horizontalCenter: parent.horizontalCenter; bottomMargin: 20 }
         text: "Click anywhere to clear the chart"
     }
 }

File:SimpleChart2.png‎
為c++類新增被呼叫的方法和訊號

下面我們就來看一下在C++的類中我們具體應該怎麼做:

class PieChart : public QDeclarativeItem
 {
     ...
 public:
     ...
     Q_INVOKABLE void clearChart();
 
 signals:
     void chartCleared();
     ...
 };

使用Q_INVOKABLE 使得Qt Meta-Object 系統可以訪問到clearChart() 方法,於是QML也可以訪問到這個方法了。請注意,由於槽函式(slots)也可以被QML呼叫,因此clearChart() 也可以被宣告為一個Qt slot 而不使用Q_INVOKABLE。這兩種方式都是有效的。

clearChart() 方法將繪製扇形圖的畫筆顏色設定成Qt::transparent(透明),並重繪扇形圖,最後發出chartCleared()訊號:

void PieChart::clearChart()
 {
     setColor(QColor(Qt::transparent));
     update();
 
     emit chartCleared();
 }

執行程式

現在我們可以啟動這個應用程式並點選其視窗區域,於是視窗上的扇形圖就消失了,並且應用程式有如下輸出:

The chart has been cleared

大家可以在 Qt 的 examples/tutorials/extending/chapter2-methods目錄中找到這個程式的完整程式碼。

相關推薦

如何在QML呼叫C++的方法接收C++的訊號

在QML中呼叫c++方法並接收訊號 繼續上一篇的內容使用C++建立新的QML型別,接下來我們在PieChart 這個類中新增一個函式"clearChart()" 和一個訊號"chartCleared",這樣在app.qml中就可以像下面一樣呼叫這個函式,並接收這個訊號了: i

android原生webview呼叫JS方法傳遞引數給JS遇到的問題

在使用webview時,需要給JS傳遞一個引數,之前前端同事把JS方法內容和html內容分離了,所以在使用下面的方法的時候一直顯示方法未定義[INFO:CONSOLE(1)] "Uncaught ReferenceError: load is not defined", s

利用c#實現dll動態庫,c++呼叫方法

           近期,在進行一個大專案開發。其中涉及多語言協同開發。主要是c#dll和c++dll的開發和應用,其中,需要在c++中呼叫c#dll的內容。現在把開發中的經驗、教訓和注意事項總結整理如下,希望對其他人能有所幫助。           1.建立c#dll,

C++11 thread程式設計呼叫方法傳入引數

#include <thread> #include <iostream> class classA { public : classA() { std::cout<<" classA " <<std::endl; }

解決C#呼叫WCF方法報錯:遠端伺服器返回錯誤 (404) 未找到

IIS配置問題,解決方法: 1. 首先新增MIME型別 副檔名“.svc”,MIME型別 “application/octet-stream”  2、處理程式對映--新增託管處理程式 請求路徑 “.svc” 型別 “System.ServiceModel.Activation.HttpH

QML呼叫C++耗時操作造成阻塞的解決辦法

  在QML中經常會呼叫用C++寫的比較耗時的操作時,一般會造成介面的卡死。剛開始的時候是想著是不是可以在QML中開闢新執行緒,一查還真有,WorkerScript。但這玩意兒有點坑的是你不能訪問其他物件的屬性、方法,官方原文是這樣寫的:   Since the

C#呼叫python方法

1. 安裝IronPython 2. 建立專案 建立一個C#的控制檯應用程式。 新增引用: 瀏覽到IronPython的安裝目錄中,新增對IronPython.dll,Microsoft.Scripting.dll 兩個dll的引用。 3. 新增Pytho

C++與QML互動2:在QML呼叫C++特性

版權宣告:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連結和本宣告。 本文連結:https:/

在deepin 15.5安裝vs code配置c/c++環境

參考了以下幾篇文章:https://www.zhihu.com/question/30315894/answer/154979413(雖然講解的是Windows環境中的安裝,但十分詳盡,很有參考價值);https://my.oschina.net/u/1044667/blog

在deepin 15.5安裝vs code配置c/c++環境(二)——配置clang

接上文:https://blog.csdn.net/defetc/article/details/79946100本文配置檔案參考:https://www.zhihu.com/question/30315894/answer/154979413一、安裝clang    apt

在Linux(Ubuntu)使用終端編譯執行.c和.cpp檔案

首先要保證系統中安裝了C語言和C++對應的編譯器:gcc -> C  ,g++ -> C++1、.c檔案的編譯與執行(1).c檔案hello.c程式碼如下:#include<stdio.h> int main() { printf("H

java呼叫儲存過程傳遞list集合引數的方法

sql: CREATE OR REPLACE TYPE test as object( FID NUMBER,  NUM nVARCHAR2(30),  TESKID NUMBER,  CID NUMBER, USERCODE nVARCHAR2(100) ) CREA

python呼叫動態連結庫(C++,linux)

1,建立並編譯C++程式 #include <fstream> #include <assert.h> #include <malloc.h> #incl

2. 編寫方法int fun(int n)判斷一個數n是否完數,是返回1,不是返回0。要求在main方法呼叫fun方法求出2~1000所有的完數,輸出。

import java.util.Scanner;public class He2  {public static void main(String[] args) {          System.out.println("1000以內的完數如下:");         

EL表示式呼叫後臺方法傳遞引數

嘗試獲取後臺物件中帶引數的get方法返回的屬性值時,發現 J2EE6 開始支援EL表示式帶引數的呼叫後臺方法。   語法格式為: ${物件名.方法名(引數)}; 注意此處的方法名是方法全名,EL表示式並不會幫我們自動按照屬性名進行首字母大寫並在開頭拼接get三個字元來尋

靜態方法呼叫service方法,以及獲取request物件

靜態方法中呼叫service方法,以及獲取request物件 //普通service方法,重點:ApplicationContextRegister物件 DictionaryService dictionaryService = ApplicationContextRe

java呼叫start()方法呼叫run()方法的區別

呼叫start()會開啟執行緒,讓開啟的執行緒去執行run()方法中的執行緒任務,此時無需等待run()方法執行完畢,即可繼續執行下面的程式碼。 呼叫run(),執行緒並未開啟,去執行run()的只有主執行緒,還是要順序指定,要等待run()方法體執行完畢後才可繼續執行下面的程

在活動呼叫getSupportFragmentManager()方法問題

今天,在寫一個小demo是,需要在活動中使用到getSupportFragmentManager()方法去獲取碎片佈局檔案,由於我使用的是v4包下的Fragment,所以我必須使用該方法獲取碎片佈局,但是卻無法呼叫getSupportFragmentManager()方法,其實確實是有些活動中無法呼

又踩.NET Core的坑:在同步方法呼叫非同步方法Wait時發生死鎖(deadlock)

之前在將 Memcached 客戶端 EnyimMemcached 遷移 .NET Core 時被這個“坑”坑的刻骨銘心(詳見以下連結),當時以為只是在建構函式中呼叫非同步方法(注:這裡的非同步方法都是指基於Task的)才會出線死鎖(deadlock)問題。 StackExchange.Redis

Swift3.0 在OC呼叫swift方法 #import "專案名-Swift.h"失效問題

很多小夥伴在xcode8 中升級swift3.0編譯工程時會出現 #import “專案名-Swift.h”失效問題 本人總結了一下,請看一下步驟: 1、Target-> Bulid Settings ->輸入packa 設定Def