首页 / C++ / qml中c++类的引用
qml中c++类的引用
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了qml中c++类的引用,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2669字,纯文字阅读大概需要4分钟。
内容图文
![qml中c++类的引用](/upload/InfoBanner/zyjiaocheng/641/fe71a1e949664954a3f0b1477d63189c.jpg)
C++类要想被QML访问,首先必须满足两个条件:一是派生自QObject类或QObject类的子类,二是使用Q_OBJECT宏。
如果你声明了Q_OBJECT宏但在程序中并没有信号与反应槽或者注册类,对程序也不会有任何影响,所以建议大家在用Qt写程序时不妨都把这个宏加上
QObject类是所有Qt对象的基类,作为Qt对象模型的核心,提供了信号与槽机制等很多重要特性。
Q_OBJECT宏必须在private区(C++默认为private)声明,用来声明信号与槽,使用Qt元对象系统提供的内容,位置一般在语句块首行。
注册动作必须在QML上下文创建前,否则无效
Projects选择Qt Quick Application,工程名为Hello。
注册关键字有很多 qmlRegisterType是其中一种
其他关键字,比如使用qmlRegisterUncreatableType进行qml类型的注册时要在主函数中先进行实例化等操作 才能在qml中调用
模板函数注册C++类到Qt元对象系统中,PackageName是需要导入到QML中的库名,basVersion和subVersion是其版本数字,QmlTypeName是在QML中可以使用的类型名。
qmlRegisterType<CppClassName>("PackageName", basVersion, subVersion, "QmlTypeName")
调用方式如下:
import PackageName basVersion.subVersion
使用qmlRegisterType进行qml类型的注册
qml中cpp类的调用(以信号槽为例)
第一步、建立C++类 Hello.cpp
#ifndef HELLO_H
#define HELLO_H
#include <QObject>
#include <QDebug>
class Hello: public QObject
{
Q_OBJECT
public slots:
void doSomething()
{
qDebug() << "Hello::dosomething() is called.";
}
signals:
void begin();
};
#endif // HELLO_H
Hello类中的信号begin()和槽doSomething()都可以被QML访问。槽必须声明为public或protected,信号在C++中使用时要用到emit关键字,但在QML中就是个普通的函数,用法同函数一样,信号处理器形式为on,Signal首字母大写(必须大写 否则报错)。信号不支持重载,多个信号的名字相同而参数不同时,能够被识别的只是最后一个信号,与信号的参数无关。
第二步、注册C++类型 main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QtQml>
#include "hello.h"
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
//注册C++类型Hello
//qmlRegisterType<CppClassName>("PackageName", basVersion, subVersion, "QmlTypeName")
qmlRegisterType<Hello>("Hello.module",1,0,"Hello");
QQmlApplicationEngine engine;
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
return app.exec();
}
第三步、在QML文件中导入C++类并使用
```cpp
import QtQuick 2.5
import QtQuick.Window 2.2
//导入注册的C++类 导入package名 加上两个版本号
// qmlRegisterType<Hello>("Hello.module",1,0,"Hello");
import Hello.module 1.0
//建立窗口
```qml
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello QML")
MouseArea {
anchors.fill: parent
onClicked: {
hello.begin();//单击鼠标调用begin信号函数
}
}
//Hello类的实例
Hello{
id:hello
onBegin:doSomething()
}
}
https://blog.51cto.com/9291927/1975383
https://blog.csdn.net/cleverhorse/article/details/86494983
内容总结
以上是互联网集市为您收集整理的qml中c++类的引用全部内容,希望文章能够帮你解决qml中c++类的引用所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。