如何在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