QML学习笔记1(qml调用c++函数)

该代码示例展示了如何在Qt环境中使用QML结合C++。通过`qmlRegisterType`注册`TestClass`类,使得QML能调用C++对象的方法。`Q_PROPERTY`宏用于暴露属性给QML,`publicslots`定义可由QML调用的函数。当消息改变时,`showMessage`信号被触发,QML侧通过`Connections`监听并响应这个信号。
摘要由CSDN通过智能技术生成
//testclass.h
#ifndef TESTCLASS_H
#define TESTCLASS_H

#include <QObject>
#include <QDateTime>
#include <QDebug>

class TestClass : public QObject
{
    Q_OBJECT
public:
    explicit TestClass(QObject *parent = nullptr);

    QString getMessage() const;
    void setMessage(const QString &value);
public slots:
     void doSamething();
     QString getTime();
signals:
    void showMessage(QString oldstr,QString newstr);
private:
    QString message="默认消息";
    int count=0;
    Q_PROPERTY(QString msg READ getMessage WRITE setMessage NOTIFY showMessage)
};

#endif // TESTCLASS_H
//testclass.cpp
#include "testclass.h"

TestClass::TestClass(QObject *parent) : QObject(parent)
{

}

QString TestClass::getMessage() const
{
    return message;
}

void TestClass::setMessage(const QString &value)
{
    if(message != value)
    {
        qDebug()<<"修改";
        showMessage(message,value);
        message=value;
    }
}

void TestClass::doSamething()
{
    setMessage(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));
}

QString TestClass::getTime()
{
    return  QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
}
//main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "testclass.h"
int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);
    qmlRegisterType<TestClass>("Myclass",1,0,"Test");

    QQmlApplicationEngine engine;
    const QUrl url(QStringLiteral("qrc:/main.qml"));
    QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
                     &app, [url](QObject *obj, const QUrl &objUrl) {
        if (!obj && url == objUrl)
            QCoreApplication::exit(-1);
    }, Qt::QueuedConnection);
    engine.load(url);

    return app.exec();
}
//main.qml
import QtQuick 2.12
import QtQuick.Window 2.12
import Myclass 1.0
import QtQuick.Controls 2.5

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")


    Test{
        id:test1
    }
    Connections{
        target: test1
        function onShowMessage(o,n){
            console.log("修改消息:",o,n);
        }
    }

    Button {
        width: 50
        height: 50
        text: "测试"
        onClicked: {
            //test1.msg=test1.getTime();
            test1.doSamething();
        }
    }
}

1,注册类,有点像C# ioc容器,实现原理可能类似?

qmlRegisterType<TestClass>("Myclass",1,0,"Test");
TestClass:类名称
Myclass,1,0:用于导入的名称,主版本和次版本,import Myclass 1.0
Test:用于qml调用的组件或对象

2,Q_PROPERTY 宏属性定义,暴露qml调用的属性

3,public slots和Q_INVOKABLE 需要找到区别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt QML是一种基于JavaScript的声明式语言,用于快速构建跨平台的用户界面。它有时需要与C++代码交互,因为C++可以提供更高性能和更底层的功能。 要在Qt QML调用C函数,需要进行以下步骤: 1. 创建一个继承自QObject的C++类,并在其中定义所需的函数。这些函数需要使用Q_INVOKABLE宏进行标记,以便在QML调用。 ```cpp // MyFunctions.h #include <QObject> class MyFunctions: public QObject { Q_OBJECT public: explicit MyFunctions(QObject *parent = nullptr); Q_INVOKABLE void myFunction(); }; ``` 2. 在QML文件中导入C++类,并使用其实例调用函数。 ```qml import MyFunctions 1.0 Window { // ... Button { text: "调用C函数" onClicked: { MyFunctions.myFunction(); } } // ... } ``` 3. 在C++代码中将该类注册到QML引擎中。 ```cpp // main.cpp #include <QGuiApplication> #include <QQmlApplicationEngine> #include "MyFunctions.h" int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); qmlRegisterType<MyFunctions>("MyFunctions", 1, 0, "MyFunctions"); QQmlApplicationEngine engine; engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); return app.exec(); } ``` 通过以上步骤,就可以在Qt QML中成功调用C函数了。在按钮点击事件中调用C++类的函数,可以在C++代码中执行所需的操作,并将结果返回到QML界面中进行展示。这种方式可以实现Qt QML框架与C++高性能功能的结合,使得开发者能够更好地发挥Qt的优秀特性和灵活性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值