• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

qml:C++调用qml函数

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

C++调用qml函数,是通过下面的函数实现的:

 

bool QMetaObject::invokeMethod(QObject *obj, const char *member, Qt::ConnectionType type, QGenericReturnArgument ret, 
QGenericArgument val0 = QGenericArgument( Q_NULLPTR ), QGenericArgument val1 = QGenericArgument(), QGenericArgument val2 = QGenericArgument(),
QGenericArgument val3 = QGenericArgument(), QGenericArgument val4 = QGenericArgument(), QGenericArgument val5 = QGenericArgument(), QGenericArgument val6 = QGenericArgument(),
QGenericArgument val7 = QGenericArgument(), QGenericArgument val8 = QGenericArgument(), QGenericArgument val9 = QGenericArgument());

 

这里有两个常用的宏:Q_RETURN_ARG,Q_ARG,从字面意思就可以看出来,一个是用来获取返回值,另一个用于传参。 下面是一个例子:

QVariant returnedValue;
QVariant msg = "message sended from C++";
QMetaObject::invokeMethod(pctrlobj, "setTextString", Q_RETURN_ARG(QVariant, returnedValue),Q_ARG(QVariant, msg));

在应用该函数调用qml对象成员前,关键是要获取到要调用的qml对象,有两种方案可以很方便的获取到qml对象:

1)  从qml端直接传QOBject * 到C++端;

2)  通过设置objectName,利用findChild()找到对应的对象;

第一种方案就不说了,很简单实现,这里简略的讲解下第二种方案,  看下面的例子:

main.qml

import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 1.3
Window {
    id: windows;
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Button{
        id: test;
        width: 70;
        height: 30;
        onClicked: test1.open();
    }

    Test1{
        id: test1;
        visible: false;
        onShowTest:{
        }
    }

    function  test()
    {
        console.log("test ok!");
    }

}

Test1.qml

import QtQuick 2.0
import QtQuick.Window 2.2
import QtQuick.Controls 1.3
Window {
        id: test;
        width: 300;
        height: 200;
        visible:false;
        signal  showTest();

        Button{
            id: testButton;
            objectName:"testButton"      //这里设置了对象名称,用于findChild()获取对象;
            text:"click me";
            onClicked:{
                showTest();
            }
        }

        function open()
        {
            test.visible = true;
        }

        function close()
        {
            test.visible = false;
        }


}

  

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QObject>
int main(int argc, char *argv[])
{
#if defined(Q_OS_WIN)
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif

    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    QObject *pRoot = engine.rootObjects().first();

    QObject *pButton = pRoot->findChild<QObject *>("testButton");
    if( pButton )
    {
           QObject::connect(pButton,SIGNAL(clicked()),pRoot,SLOT(test()));
    }

    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
building'fdfs_client.sendfile'extensionerror:MicrosoftVisualC++14.0isrequired.Ge ...发布时间:2022-07-13
下一篇:
任务超时退出的方法C#发布时间:2022-07-13
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap