“Yeah It’s on. ”
C++注册QObject
* qmlRegisterType 是一个可以将C++实现的类在QML中调用的,连接C++和QML的一个工具
* mlRegisterType里总共4个参数,第一个参数* uri指的是QML中import后的内容,
相当于头文件名,第二个第三个参数分别是主次版本号,第四个指的是QML中类的名字
(必须首字母大写)
//C++
//实例一个QQuickView
//main.cpp
qmlRegisterType<DDuiInterface>("MyDataInterface",1,1,"DDuiInterface");
//DDuiInterface 类
#ifndef DDUIINTERFACE_H
#define DDUIINTERFACE_H
#include <QObject>
/**********************************************************/
/*qml 和 数据层通行接口类,在qml实例此接口和数据层通信
/*********************************************************/
#include <QObject>
class DDuiInterface : public QObject
{
Q_OBJECT
Q_PROPERTY(QString strError READ getError WRITE setError)
public:
explicit DDuiInterface(QObject *parent = 0);
QString getError(){ return strError;}
void setError(const QString& error){strError = error;}
signals:
//notify qml the data has responsed
void signalResponseDataReady(bool error,int cmd,QStringList finalData);
//notify qml to updata ui⋯⋯
void signalNotifyUI(bool error,int cmd,QStringList notifyData);
public slots:
//process the qml Request
void slotRequestData(int cmd,QStringList parameterList);
//process the qml Response
void slotResponseNotifyUI(bool error,int cmd,QStringList processResult);
void creatConnection();
void slotChangeCursor(int flag);
private:
QString strError;
bool isConnected;
};
#endif // DDUIINTERFACE_H
//QML代码
//导入该包名 C++里面注册的
import MyDataInterface 1.1
Item {
id:container
width: 613
height: 569
property variant chatArrId: []
property Item chatUI;
property int iMargin: 6
signal signalRevicSlot(variant tmp);
signal signalTabViewChanged(variant info,string iType);//1:delete 2: send msg //3:currentindex changed;
Component.onCompleted: {
signalTabViewChanged([0,1,2,2],2);
}
}
//实例该对象
DDuiInterface{
id:dataInterface
}
main函数注册单例(1)
* 一个基于QQmlApplicationEngine的app
* C++单例注册到QML中
//main.cpp
QApplication app(argc, argv);
QQmlApplicationEngine engine;
DDuiObjInstance dduiObj;//单例
engine.rootContext()->setContextProperty("dduiObj", &dduiObj);
engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
app.exec();
//QML代码示例
//与C++进行通信的单例 可以监听该单例的任何信号
//可以在任何基于该程序的子qml里面使用该单例的函数
//该单例的函数必须为槽函数 或者方法前加上Q_INVOKABLE进行修饰
Connections {
target: dduiObj //C++注册的单例
onSignalPrintFinished: console.log("The print page data finished!")
}
main函数注册单例(2)
* 一个基于QQmlApplicationEngine的app
* C++单例注册到QML中
// First, define the singleton type provider function (callback).
// 注册单例函数
static QObject* CPlusPlusSingletonRegisterFunc(
QQmlEngine* pQMLEngine,
QJSEngine* pJSEngine )
{
Q_UNUSED( pQMLEngine );
Q_UNUSED( pJSEngine );
DDuiObjInstance* pSingleton = new DDuiObjInstance;
return pSingleton;
}
//main.cpp
QApplication app(argc, argv);
QQmlApplicationEngine engine;
// 首先注册一下单例
qmlRegisterSingletonType<CPlusPlusSingleton>(
"DDuiObjInstance", // 统一资源标识符
1, // 主版本
0, // 次版本
"dDuiObjInstance", // 单例名称
CPlusPlusSingletonRegisterFunc ); // 函数名
engine.load(QUrl(QStringLiteral("qrc:///main.qml")));
app.exec();
//QML代码示例
//与C++进行通信的单例 可以监听该单例的任何信号
//可以在任何基于该程序的子qml里面使用该单例的函数
//该单例的函数必须为槽函数 或者方法前加上Q_INVOKABLE进行修饰
import DDuiObjInstance 1.1
Connections {
target: dDuiObjInstance //C++注册的单例
onSignalPrintFinished: console.log("The print page data finished!")
}
应用场景
- 方便QML写高效率的UI
- 方便C++处理高效的算法和业务
- 实现C++与界面分离
- 实现C++与QML的桥梁连接
有问题反馈
在使用中有任何问题,欢迎反馈给我,可以用以下联系方式跟我交流
- 邮件(373955953#qq.com, 把#换成@)
- QQ: 39559539234
- QQ群:312125701
- github: @寒山-居士
关于作者
var duoduozhijiao = {
nickName : "寒山-居士",
site : "http://www.heilqt.com",
blog : "http://blog.heilqt.com"
}