1. 程式人生 > >qml與c++之間的互動

qml與c++之間的互動

學習qml的筆記,Qt Quick核心程式設計的一個例子:

1、實現一個類(從object以及派生類中繼承而來),使用Q_OBJECT巨集。

#ifndef COLORMAKER_H
#define COLORMAKER_H
#include <QObject>
#include <QColor>
class ColorMaker : public QObject
{
    Q_OBJECT
    Q_ENUMS(GenerateAlgorithm)
    Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
    Q_PROPERTY(QColor timeColor READ timeColor)
public:
    ColorMaker(QObject *parent = 0);
    ~ColorMaker();
    enum GenerateAlgorithm{
        RandomRGB,
        RandomRed,
        RandomGreen,
        RandomBlue,
        LinearIncrease
    };
    QColor color() const;
    void setColor(const QColor & color);
    QColor timeColor() const;
    Q_INVOKABLE GenerateAlgorithm algorithm() const;
    Q_INVOKABLE void setAlgorithm(GenerateAlgorithm algorithm);
signals:
    void colorChanged(const QColor & color);
    void currentTime(const QString &strTime);
public slots:
    void start();
    void stop();
protected:
    void timerEvent(QTimerEvent *e);
private:
    GenerateAlgorithm m_algorithm;
    QColor m_currentColor;
    int m_nColorTimer;
};
#endif // COLORMAKER_H



//定時改變顏色、顯示當前時間的一個類的實現
#include <QTimerEvent>
#include <QDateTime>
ColorMaker::ColorMaker(QObject *parent)
    : QObject(parent)
    , m_algorithm(RandomRGB)
    , m_currentColor(Qt::black)
    , m_nColorTimer(0)
{
    qsrand(QDateTime::currentDateTime().toTime_t());
}
ColorMaker::~ColorMaker()
{
}
QColor ColorMaker::color() const
{
    return m_currentColor;
}
void ColorMaker::setColor(const QColor &color)
{
    m_currentColor = color;
    emit colorChanged(m_currentColor);
}
QColor ColorMaker::timeColor() const
{
    QTime time = QTime::currentTime();
    int r = time.hour();
    int g = time.minute()*2;
    int b = time.second()*4;
    return QColor::fromRgb(r, g, b);
}
ColorMaker::GenerateAlgorithm ColorMaker::algorithm() const
{
    return m_algorithm;
}
void ColorMaker::setAlgorithm(GenerateAlgorithm algorithm)
{
    m_algorithm = algorithm;
}
void ColorMaker::start()
{
    if(m_nColorTimer == 0)
    {
        m_nColorTimer = startTimer(1000);
    }
}
void ColorMaker::stop()
{
    if(m_nColorTimer > 0)
    {
        killTimer(m_nColorTimer);
        m_nColorTimer = 0;
    }
}
void ColorMaker::timerEvent(QTimerEvent *e)
{
    if(e->timerId() == m_nColorTimer)
    {
        switch(m_algorithm)
        {
        case RandomRGB:
            m_currentColor.setRgb(qrand() % 255, qrand() % 255, qrand() % 255);
            break;
        case RandomRed:
            m_currentColor.setRed(qrand() % 255);
            break;
        case RandomGreen:
            m_currentColor.setGreen(qrand() % 255);
            break;
        case RandomBlue:
            m_currentColor.setBlue(qrand() % 255);
            break;
        case LinearIncrease:
            {
                int r = m_currentColor.red() + 10;
                int g = m_currentColor.green() + 10;
                int b = m_currentColor.blue() + 10;
                m_currentColor.setRgb(r % 255, g % 255, b % 255);
            }
            break;
        }
        emit colorChanged(m_currentColor);
        emit currentTime(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));
    }
    else
    {
        QObject::timerEvent(e);
    }
}



2、在下文建立聯絡之前 將c++類註冊為qml類

#include "colormaker.h"

qmlRegisterType<Colormaker>("qt.Colormaker", 1, 0, "Colormaker");

3、在qml中匯入c++註冊完成的類
import an.qt.ColorMaker 1.0

4、建立例項

Colormaker{
        id:colorMaker;
        color: Qt.green;
    }



qml直接呼叫c++函式

c++中通過傳送訊號---->>qml中接收並處理

相關推薦

qmlc++之間互動

學習qml的筆記,Qt Quick核心程式設計的一個例子:1、實現一個類(從object以及派生類中繼承而來),使用Q_OBJECT巨集。 #ifndef COLORMAKER_H #define COLORMAKER_H #include <QObject>

qmlc++物件互動

c++修改、訪問qml屬性、呼叫qml方法(引數傳遞)、qml訊號繫結到c++物件的槽上,傳遞各種型別的引數: main.cpp 設定qml屬性、訪問qml屬性、呼叫qml函式、關聯qml訊號與c++物件的槽函式 #include <QGui

QMLC++互動 登陸介面設計

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

qmlC++互動傳值的簡單demo

qml 與C++的後臺互動,參照foruok大神的寫法自己研究,改動了一下,有不足 的地方還望路過的大神指出, 我用的是Qt5.7.1,做了個簡單的demo,下面是我的程式碼原始碼 具體的操作過程如下: 新建選擇Application專案 中的Qt Quick Contro

QMLc++互動的一些坑

這個是轉載的,【lvliang2008】, #include <QtGui/QApplication> #include <QtDeclarative/QDeclarativeView> #inc

c++中的訊號QML中的函式繫結(連結)起來 以及qmlc++互動重要筆記

signals: Q_INVOKABLE void buttonLeft();     Q_INVOKABLE void buttonRight();     Q_INVOKABLE void buttonShort();    Q_INVOKABLE void butto

QtQuick系列教程(6)-QmlC++互動

總目錄傳送 本博文技術等級: ★★☆☆☆☆☆☆☆☆ QML 作為一種靈活高效的介面開發語言已經越來越得到業界的認可。QML 負責介面,C++ 負責邏輯,這也是 Qt 官方推薦的開發方式。那麼 QML 與 C++ 的互動必然是需要我們掌握並且精通的。 本 C

快速掌握Lua 5.3 —— LuaC之間互動概覽

Q:什麼是Lua的虛擬棧? A:C與Lua之間通訊關鍵內容在於一個虛擬的棧。幾乎所有的呼叫都是對棧上的值進行操作,所有C與Lua之間的資料交換也都通過這個棧來完成。另外,你也可以使用棧來儲存臨時變數。 每一個與Lua通訊的C函式都有其獨有的虛擬棧,虛擬棧由L

Qt Quick 之 QML C++ 混合編程具體解釋

ack world 避免 pub start 模板方法 另一個 一秒 gis Qt Quick 技術的引入。使得你能夠高速構建 UI ,具有動畫、各種絢麗效果的 UI 都不在話下。但它不是萬能的。也有非常多局限性,原來 Qt 的一些技術,比方低階的網絡編程如 Q

CC++之間相互調用

end att toolbar 處理 處理器 執行文件 客戶 c語言項目 title http://www.cnblogs.com/luxiaoxun/p/3405374.html 1、導出C函數以用於C或C++的項目 如果使用C語言編寫的DLL,希望從中導出函數給C或C+

C/C++C#之間類型的對應

border system pcs left 類名 gid tab out param 最近在研究pos打印機相關功能, 調用winapi以及跨進程通信等,都涉及到類型之間的轉換。 C/C++ C# HANDLE, LPDWOR

Golang 中如何用 CGO C 之間做一個快取 buffer

Golang 是一個不錯的語言,尤其是做一個快取中間層是非常非常容易的。比較常見的場景就是我們在讀一個很大很大的檔案的時候,我們是做不到一次載入檔案到記憶體的,Golang 可以做到一點一點的將檔案讀至末尾,慢慢處理完,相信很多語言也很容易做到這個,那如果在處理這個檔案的時候專案的主語言是 Golang 而需

表值引數簡介及 C# 的互動

在 SQL Server 2008 中引入表值引數之前,用於將多行資料傳遞到儲存過程或引數化 SQL 命令的選項受到限制。 開發人員可以選擇使用以下選項,將多個行傳遞給伺服器: 1. 使用一系列單個引數表示多個數據列和行中的值。 使用此方法傳遞的資料量受所允許的引數數量的限制。 SQL Serv

PythonC之間的相互呼叫(Python C API及Python ctypes庫)

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

Android中JNI使用詳解(4)---JavaC之間資料型別轉換

Jni中基本型別轉換對應的表格 Java型別 本地型別 說明 boolean jboolean 無符號,8位 byte jbyte

QMLC++混合程式設計

文章參考: https://blog.csdn.net/foruok/article/details/32698603 http://blog.51cto.com/9291927/1975383 QT專案開發過程中,畫面上顯示的佈局以及對應的資料可能會動態變化,如果只用QML來構件簡單的

C/C++C#之間型別的對應

C/C++ C# HANDLE, LPDWORD, LPVOID, void* IntPtr LPCTSTR, LPCTSTR, LPSTR, char*, const char*, W

Unity3D中jsC#之間相互呼叫的解決辦法

轉載自:http://www.manew.com/3102.html Unity3D中一些指令碼的方法只能用在JS中,在C#中是無效的,而C#可以與伺服器端通訊,JS本身卻不行。而且,如果需要用到js呼叫c#的問題,js會比c#先編譯,所以在mac裡編譯ios的時候會出錯,

JavascriptC++之間的通訊 —— WebBrowser

1、C++呼叫WebBrowser中的全域性函式,變數等 (1) 從C++的角度看WebBrowser中的物件 WebBrowser中的物件大致可以分成兩類:DOM物件和使用Javascript建立的物件。但是無論是那種物件,從C++的角度來看,都是一些實現了IDispat

Qt Quick 之 QML C++ 混合程式設計詳解

    Qt Quick 技術的引入,使得你能夠快速構建 UI ,具有動畫、各種絢麗效果的 UI 都不在話下。但它不是萬能的,也有很多侷限性,原來 Qt 的一些技術,比如低階的網路程式設計如 QTcpSocket ,多執行緒,又如 XML 文件處理類庫 QXmlStreamR