Qml与Cpp交互

cpp使用qml函数

qml:

Control.Label
{
    objectName: 'cpp'
    text:"hello"
    font.pointSize: 18
    function getText(info)
    {
        return text+info;
    }
}

cpp:

auto root = engine.rootObjects();
auto laqml = root.first()->findChild<QObject*>("cpp");
QVariant ret;
QMetaObject::invokeMethod(laqml,"getText",Q_RETURN_ARG(QVariant,ret),Q_ARG(QVariant,"ni da ge"));
qDebug()<<ret.toString()

#qml使用cpp函数
qml

Control.Button
{
    text: "qing"
    onClicked:
    {
        Person.printPerson()
    }
}

cpp:

//qml调用cpp函数
	Person person1("zhou",5);
	auto context = engine.rootContext();
	context->setContextProperty("Person",&person1);

qml使用的函数前面要加上Q_INVOKABLE

Q_INVOKABLE void printPerson();

qml接受Cpp信号

qml

//qt版本5.12.12无法响应,6.2可以响应,函数名一定是on后面接大写:例如:cpp 信号为 qmlCall qml接收函数为onQmlCall

Connections
{
     target: Person
     function onQmlCall(){
         console.log("call back");
     }
 }

Cpp 的类型注册到qml

第一种方式注入

注册方法:

//这个模板函数在QML系统中用名称qmlName注册c++类型,在从uri导入的库中使用由versionMajor和versionMinor组成的版本号
qmlRegisterType<Info>("LiuInfo",1,0,"Info");

Cpp

class Info :public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString m_name READ getName WRITE setName NOTIFY sigNameChanged)
    Q_PROPERTY(int m_age READ getAge  WRITE setAge  NOTIFY sigAgeChanged)
    Q_PROPERTY(QDate m_date READ getDate  WRITE setDate  NOTIFY sigDateChanged)
public:
    using QObject::QObject;
    void setName(QString name);
    QString getName();
    void setAge(int age);
    int getAge();
    void setDate(QDate date);
    QDate getDate();
signals:
    void sigNameChanged();
    void sigAgeChanged();
    void sigDateChanged();
private:
    QString m_name;
    int m_age;
    QDate m_date;
};

qml

import LiuInfo 1.0
Info
{
    id:info
    m_name:"hello"
    m_age:18
    m_date:Qt.formatDate(new Date(),"yyyy-MM-dd")
    function printInfo()
    {
        console.log(m_name+"age:"+m_age+m_date);
    }
}
};

第二种方式注入

QML_ELEMENT
Qt对其解释为:声明外围类型或名称空间在QML中可用,使用其类或名称空间名称作为QML元素名称,
您可以使用构建系统在类型命名空间com.mycompany.qmlcomponents(主版本1)中注册该类型。对于qmake,在项目文件中指定以下内容:
CONFIG += qmltypes
QML_IMPORT_NAME = com.mycompany.qmlcomponents
QML_IMPORT_MAJOR_VERSION = 1
代码具体如下:

class Info :public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString m_name READ getName WRITE setName NOTIFY sigNameChanged)
    Q_PROPERTY(int m_age READ getAge  WRITE setAge  NOTIFY sigAgeChanged)
    Q_PROPERTY(QDate m_date READ getDate  WRITE setDate  NOTIFY sigDateChanged)
    QML_ELEMENT
class Info :public QObject
{
    Q_OBJECT
    Q_PROPERTY(QString m_name READ getName WRITE setName NOTIFY sigNameChanged)
    Q_PROPERTY(int m_age READ getAge  WRITE setAge  NOTIFY sigAgeChanged)
    Q_PROPERTY(QDate m_date READ getDate  WRITE setDate  NOTIFY sigDateChanged)
    QML_ELEMENT

.pro文件中添加

CONFIG += qmltypes
QML_IMPORT_NAME = LiuInfo
QML_IMPORT_MAJOR_VERSION = 1

第三种方式

作为附加属性到别的类中

class Person : public QObject
{
    Q_OBJECT
public:
    Person(QString name,int age);
    Q_INVOKABLE void printPerson() noexcept;
    QML_ATTACHED(Info)
    QML_ELEMENT
	
	//必须实现此函数,不然会报error: 'qmlAttachedProperties' is not a member of 'Person'
    static Info *qmlAttachedProperties(QObject *);
signals:
    void qmlCall() const;

public slots:
    void slotPrintSignal();
    void slotCountClickTen(int count);
private:
    QString m_pname;
    int m_page;
};

第四种方式:

//这个模板函数在QML系统中用名称qmlName注册c++类型,在从uri导入的库中使用由versionMajor和versionMinor组成的版本号。虽然类型有名称和类型,但无法创建它,如果尝试创建,将会产生给定的错误消息。

当类型仅用于提供附加属性或枚举值时,这很有用
qmlRegisterUncreatableType<Person>("LiuPerson",1,0,"Person","bad");

当你要创建实例时:
出现错误:qrc:/main.qml:18:9: bad 其中bad就是我们自己定义的字符串

Person
{

}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值