C++和QML混合编程(上):QML中调用C++

QML是一门描述性语言,拥有JavaScript扩展格式的语法结构。使用QML编程能够快速设计出好看的界面,但是有些复杂的功能不能完美实现,这时候就需要C++提供逻辑。
使用属性、方法属性、方法返回值和信号参数值从C++传输数据到QML.

1.QML中注册C++

QML中注册C++有两种方法,通过qmlRegisterType或rootContext()
定义Message类,在main.cpp中包含对应类头文件, qmlRegisterType(“an.qt.Message”, 1, 0, “Message”); //注册C++类
在QML文件中直接使用import an.qt.Message 1.0,然后Message{id:m_message}实例对象
注册全局属性:Message msg; //C++类
engine.rootContext()->setContextProperty(“msg2”,&msg); //注册C++类为QML上下文属性,在QML文件中可以直接用msg2调用属性,方法等

2.使用属性

使用属性在C++和QML间传递数据是,可以使用Q_PROPERTY()宏。Q_PROPERTY()宏在所有QObject派生类中使用。
Q_PROPERTY(QString author READ author WRITE setAuthor NOTIFY authorChanged)

    void Message::setAuthor(const QString &a)
{
    if(a!=m_author)
    {
        m_author=a;
        emit authorChanged();
    }
}

QString Message::author() const
{
    return m_author;
}

在QML中获取或者设置C++属性author:

   Text{
        anchors.centerIn: parent
        text:msg2.author   //获取C++属性author
        Component.onCompleted: msg2.author="Jonah"  //设置C++属性author
    } 

3.QML中调用C++方法

派生至QObject的类都可以在QML代码中调用方法,Message类中函数使用Q_INVOKABLE()宏或者直接定义函数为槽函数
    Q_INVOKABLE bool postMessage(const QString &);
   bool Message::postMessage(const QString &msg)
   {
     qDebug()<<"Called the C++ method with"<<msg;
    return true;
    }  
    通过对象调用函数
    msg2.postMessage("打印")  //调用C++方法
   槽函数:
   public slots:void refresh();
    msg2.refresh()  //调用C++槽

4.使用枚举类型

Message头文件中
enum MESSAGE_COLOR {
MESSAGE_COLOR_YELLOW,
MESSAGE_COLOR_RED,
MESSAGE_COLOR_BLUE,
MESSAGE_COLOR_ALL
}; 由于需要在QML中调用C++枚举类型,需要用到Q_ENUMS()宏Q_ENUMS(MESSAGE_COLOR),在QML中使用枚举类型的方式是.,例如Message.MESSAGE_COLOR_ALL

5.使用信号槽

在上面提到的QML调用C++方法中,就说到了可以直接通过将函数定义为槽函数,然后直接供QML调用,下面主要讲述连接C++信号到QML槽
在Message类中定义信号 void sendresfresh(QDate sendvalue);这里信号定义为QData类型,形参为sendvalue
在QML槽函数中sendvalue为C++信号的形参,可以直接使用


    Connections{    //连接C++信号到QML槽
            target: msg2
            onSendresfresh:{
                var v=sendvalue.toString("yyyy/MM/dd");
                console.log("C++ signal to Qml",v)
            }
        }

更多详见:
C++和QML混合编程(下):C++中调用QML

转载请注明出处:https://blog.csdn.net/qq_35173114/article/details/80873024
源码链接:https://download.csdn.net/download/qq_35173114/10511661

猜你喜欢

转载自blog.csdn.net/qq_35173114/article/details/80873024