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
    评论
QML 与 C++ 交互的过程一般分为以下几个步骤: 1. 定义 C++ 类并注册到 QML 中 你需要在 C++ 中定义一个类,该类封装了你想要实现的功能。同时,你需要使用 `qmlRegisterType` 函数将该类注册到 QML 中,以便在 QML 中使用该类。 例如,你可以定义一个名为 `MyClass` 的类,并将其注册到 QML 中: ```cpp class MyClass : public QObject { Q_OBJECT public: Q_INVOKABLE int myFunction(int arg) { // 实现你的功能 } }; qmlRegisterType<MyClass>("com.example", 1, 0, "MyClass"); ``` 在上面的代码中,`Q_INVOKABLE` 用于声明 `myFunction` 函数可从 QML 中调用,`qmlRegisterType` 函数用于将 `MyClass` 类注册到 QML 中。`"com.example"` 表示注册的命名空间,`1` 和 `0` 表示主版本号和次版本号,`"MyClass"` 是在 QML 中使用的类名。 2. 在 QML 中使用 C++ 类 在 QML 中使用 C++ 类时,你需要使用 `import` 语句导入该类所在的命名空间。然后,你可以通过该命名空间来访问该类。例如: ```qml import com.example 1.0 MyClass { id: myClass } Button { onClicked: { var result = myClass.myFunction(42) // 处理返回 } } ``` 在上面的代码中,`import` 语句用于导入 `com.example` 命名空间,`MyClass` 用于创建一个 `MyClass` 实例,`id` 属性用于设置实例的标识符,`Button` 用于创建一个按钮,`onClicked` 事件处理程序中调用了 `myFunction` 函数,并处理了它的返回。 3. 在 C++ 中访问 QML 中的对象 如果你需要从 C++ 中访问 QML 中的对象,你可以使用 `QQuickItem` 类提供的 `findChild` 函数。例如: ```cpp QQuickItem *item = qmlEngine.rootObjects().value(0)->findChild<QQuickItem*>("myItem"); if (item) { // 处理 item 对象 } ``` 在上面的代码中,`qmlEngine.rootObjects()` 函数返回 QML 引擎中所有的根对象,`value(0)` 返回第一个根对象,`findChild` 函数用于查找名为 `"myItem"` 的子对象。 以上就是 QML 与 C++ 交互的基本步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值