1. 程式人生 > >如何在C++程式碼中連線QML程式碼中的訊號

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

#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();
}
在上面的程式碼中,我們把view的rootObject,也即我們下面即將講到的MainView,連到我們定義的兩個signal:
    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-rcnndemo.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