如何在C++程式碼中連線QML程式碼中的訊號
在QML應用設計中,C++在很多的時候作為一個語言來為應用做一些需要計算或拓展QML功能的選項.在今天的例程中,我們來介紹如何連線QML程式碼中的訊號.具體更多的閱讀,可以參閱文章"Interacting with QML Objects from C++".
為了說明問題的方便,我們還是來貼上我們的程式碼:
myclass.h
#ifndef MYCLASS_H #define MYCLASS_H #include <QObject> #include <QQuickItem> #include <QDebug> class MyClass : public QObject { Q_OBJECT public: MyClass(QObject *parent = 0); public slots: // This is a slot for QString only void cppSlot(const QString &msg) { qDebug() << "Called the C++ slot with message:" << msg; } // This is the slot for a generic data type void cppSlotForGenericData(const QVariant &v) { qDebug() << "Called the C++ slot with value:" << v; QQuickItem *item = qobject_cast<QQuickItem*>(v.value<QObject*>()); qDebug() << "Item dimensions:" << item->width() << item->height(); } }; #endif // MYCLASS_H
在這裡,我們定義了兩個slots.第一個slot是用來接受一個QString來作為引數的.第二個slot是用一個通用的QVariant來作為引數,也即它可以用任何一個型別的資料來傳人,包括第一種情況.具體關於QML的基本資料型別,可以參閱文章"QML Basic Types".
main.cpp
在上面的程式碼中,我們把view的rootObject,也即我們下面即將講到的MainView,連到我們定義的兩個signal:#include <QGuiApplication> #include <QQmlApplicationEngine> #include <QQuickView> #include <QQuickItem> #include "myclass.h" int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQuickView view; view.setSource(QUrl(QStringLiteral("qrc:///Main.qml"))); view.setResizeMode(QQuickView::SizeRootObjectToView); QObject *item = view.rootObject(); MyClass myClass; // Connect a QString data type slot QObject::connect(item, SIGNAL(qmlSignal(QString)), &myClass, SLOT(cppSlot(QString))); // Connect a generic slot QObject::connect(item, SIGNAL(qmlSignalGeneric(QVariant)), &myClass, SLOT(cppSlotForGenericData(QVariant))); view.show(); return app.exec(); }
signal qmlSignal(string msg)
signal qmlSignalGeneric(var anObject)
我們的Main.qml設計也非常簡單:
Main.qml
import QtQuick 2.0 import Ubuntu.Components 1.1 /*! \brief MainView with a Label and Button elements. */ MainView { id: main // objectName for functional testing purposes (autopilot-qt5) objectName: "mainView" // Note! applicationName needs to match the "name" field of the click manifest applicationName: "connectiontoqmlsignal.liu-xiao-guo" /* This property enables the application to change orientation when the device is rotated. The default is false. */ //automaticOrientation: true // Removes the old toolbar and enables new features of the new header. useDeprecatedToolbar: false signal qmlSignal(string msg) signal qmlSignalGeneric(var anObject) width: units.gu(60) height: units.gu(85) Page { id: page title: i18n.tr("connectiontoqmlsignal") Column { anchors.fill: parent spacing: units.gu(2) Button { width: parent.width text: i18n.tr("Send signal to C++!") onClicked: { main.qmlSignal("Hello from QML!") } } Button { width: parent.width text: "Send a generic data to C++" onClicked: { main.qmlSignalGeneric(main) } } } } }
執行我們的應用:
應用的輸出:
QML debugging is enabled. Only use this in a safe environment.
Loading module: 'libubuntu_application_api_touch_mirclient.so.3.0.0'
Called the C++ slot with message: "Hello from QML!"
Called the C++ slot with value: QVariant(QObject*, Main_QMLTYPE_46(0xdebec0, name = "mainView") )
Item dimensions: 540 919
整個專案的原始碼在:https://github.com/liu-xiao-guo/connectiontoqmlsignal
相關推薦
如何在C++程式碼中連線QML程式碼中的訊號
在QML應用設計中,C++在很多的時候作為一個語言來為應用做一些需要計算或拓展QML功能的選項.在今天的例程中,我們來介紹如何連線QML程式碼中的訊號.具體更多的閱讀,可以參閱文章"Interacting with QML Objects from C++". 為了說明問
eclipse 開發中連線sql server中的問題
簡述: 在開發中需要配置sql server 做資料庫 報錯: 遇到資料庫始終無法連線的情況, 報錯如下: org.apache.commons.dbcp.SQLNestedException: Cannot create PoolableConnectionFactor
QT中程式碼中與設計器中控制元件訊號與SLOT連線
雙擊testqt.ui 託一個push button到窗體中,雙擊,可以輸入字元 按F4或 menu->edit->edit signals/slots 定義SLOT 選擇已定義好的SLOT,點確定就可以進行關聯了。 定義自定義SLO
vs的一些常用設定和c#中的一些程式碼解釋
shift +空格切換全形半形 ctrl+f可以啟用vs的搜尋功能,然後可以搜尋所建專案中的的內容 c#中程式碼以分號結束 Console.WriteLine();輸出內容。 Console.ReadKey();:作用暫停當前程式;等待使用者按任意鍵繼續,按鍵會顯示在螢幕上。 執
關於嚴蔚敏老師《資料結構(C語言版)》書中程式碼的誤解
清華大學嚴蔚敏老師的《資料結構(C語言版)》以其嚴謹被奉為經典,我是從其Pascal版一路追著買到C語言版,一直覺得這本書理論功力深厚,是不可多得的資料結構教材。但其編寫過程中為避免太過拘泥於具體語言細節,使用了ADT描述,具體演算法中使用了偽碼描述,對於新手直接把程式碼原樣照抄是沒法直接在電腦
jdbc 中通過Java程式碼連線資料庫
示例程式碼 1.通過建立一個類 寫出連線資料庫的相關屬性 username,password,URL,Connection Statement . Resultset 物件 2.載入並註冊MySQL的驅動——在Java程式中,可以通過 “Class.forName(“
C# 一段高效拆分url請求地址中引數的程式碼
private static Dictionary<string, string> GetRequestParameters(string row) {
完整java開發中JDBC連線資料庫程式碼和步驟
宣告:來自Hongten(部落格園) JDBC連線資料庫 建立一個以JDBC連線資料庫的程式,包含7個步驟: 1、載入JDBC驅動程式: 在連線資料庫之前,首先要載入想要連線的資料庫的驅動到JVM(Java虛擬機器), 這通過java.lang
C#中解析javascript程式碼
先上程式碼: 該類需要你新增對程式集 Microsoft.JScript 的引用;如果把“current version with JScriptCodeProvider” 部分程式碼替換為“deprecated version with Vsa”部分程式碼,你還需要新增對程式集 Microsoft.
lua同c++的互動之在c++中呼叫lua程式碼
#include <iostream> #include <string.h> using namespace std; extern "C" { #include "lua.h" #include "lauxlib.h" #
py-faster-rcnn中demo.py程式碼與C++版本的程式碼對比: part01 鋪墊, demo.py引入的模組
★ python程式碼 tools/demo.py 中import的內容, 是整個程式碼流程的鋪墊, 理解了import的內容, 對理解後續的python程式碼和C++ 程式碼都有幫助. demo.py的import內容: import _
.net/c#中棧和堆的區別及程式碼在棧和堆中的執行流程詳解
在.NET framework環境下,當我們的程式碼執行時,記憶體中有兩個地方用來儲存這些程式碼。假如你不曾瞭解,那就讓我來給你介紹棧(Stack)和堆(Heap)。棧和堆都用來幫助我們執行程式碼的,它們駐留在機器記憶體中,且包含所有程式碼執行所需要的資訊。 棧負責儲存我們的程式碼執行(或呼叫)路徑,而
《Linux作業系統分析》之使用庫函式API和C程式碼中嵌入彙編程式碼兩種方式使用同一個系統呼叫
本篇文章分析的是使用庫函式API和C程式碼中嵌入彙編程式碼兩種方式使用同一個系統呼叫,來說明在Linux系統中,系統呼叫的實現機制。 相關知識 首先關於這篇文章會介紹一些用到的知識。 一、什麼是核心態,什麼又是使用者態。 核心態:在高執行級別下,程式碼可以執行特權指令,
URLParser:很實用的URL引數解析器(JAVA程式碼中方便獲取QueryString中的get引數)
很實用的URL引數解析器(JAVA程式碼中方便獲取QueryString中的get引數) package com.kaishustory.quick.commons.text; import java.io.UnsupportedEncodingException; import
js程式碼識別字符串中的數字,並返回數字
有的時候我們經常需要從字串中提取數字,作為特殊的用途,對於一些沒有規律可循的字串來說,想要按照平常的方法提起數字會比較的繁瑣,因此使用正則表示式來識別字符串中的數字,程式碼如下: /** * 獲取字串中的數字 * @param str */ fun
在Keil中 自動格式化 程式碼
轉載:https://www.ruitz.cn/?p=117 在rtz使用Visual Studio或者IDEA等IDE時,經常會用到這些IDE提供的“自動格式化程式碼”功能。 在日常Coding的過程中,調整程式碼經常會造成格式混亂,複製貼上程式碼時也會發生縮排錯誤等影響格式的錯誤。
php程式碼實現form表單中檔案的上傳
<?php //1、注意:檔案上傳之後的資訊都儲存在$_FILES全域性變數中。 // print_r($_FILES); //2、判斷使用者是否提交資料 if(!empty($_FILES)){ //3、獲取當前上傳檔案的型別 $type=$_FILES["m
magento中有用的程式碼片段
建立訂單,需要有一個包含地址的個人賬戶 $id=1; // get Customer Id $customer = Mage::getModel('customer/customer')->load($id); $transaction = Mage::getModel('cor
python中三行程式碼搞定發郵件
一般發郵件方法 我以前在通過Python實現自動化郵件功能的時候是這樣的: import smtplib from email.mime.text import MIMEText from email.header import Header # 傳送郵箱伺服器 smtpserver
所謂的網頁爬蟲用java程式碼來實現,此程式碼適合在maven專案中使用中使用,因為,程式碼中的類所對應的依賴可以讓maven下載。
//獲得httpClient物件 CloseableHttpClient httpClient = HttpClients.createDefault(); //url公司域名隨便 String url = "https://www.baidu.co