QML是一门描述性语言,拥有JavaScript扩展格式的语法结构。使用QML编程能够快速设计出好看的界面,但是有些复杂的功能不能完美实现,这时候就需要C++提供逻辑。
使用属性、方法属性、方法返回值和信号参数值从C++传输数据到QML.
1.QML中注册C++
QML中注册C++有两种方法,通过qmlRegisterType或rootContext()
定义Message类,在main.cpp中包含对应类头文件, qmlRegisterType(“an.qt.Message”, 1, 0, “Message”); //注册C++类
在QML文件中直接使用import an.qt.Message 1.0,然后Message{id:m_message}实例对象
注册全局属性:Message msg; //C++类
engine.rootContext()->setContextProperty(“msg2”,&msg); //注册C++类为QML上下文属性,在QML文件中可以直接用msg2调用属性,方法等
2.使用属性
使用属性在C++和QML间传递数据是,可以使用Q_PROPERTY()宏。Q_PROPERTY()宏在所有QObject派生类中使用。
Q_PROPERTY(QString author READ author WRITE setAuthor NOTIFY authorChanged)
void Message::setAuthor(const QString &a)
{
if(a!=m_author)
{
m_author=a;
emit authorChanged();
}
}
QString Message::author() const
{
return m_author;
}
在QML中获取或者设置C++属性author:
Text{
anchors.centerIn: parent
text:msg2.author //获取C++属性author
Component.onCompleted: msg2.author="Jonah" //设置C++属性author
}
3.QML中调用C++方法
派生至QObject的类都可以在QML代码中调用方法,Message类中函数使用Q_INVOKABLE()宏或者直接定义函数为槽函数
Q_INVOKABLE bool postMessage(const QString &);
bool Message::postMessage(const QString &msg)
{
qDebug()<<"Called the C++ method with"<<msg;
return true;
}
通过对象调用函数
msg2.postMessage("打印") //调用C++方法
槽函数:
public slots:void refresh();
msg2.refresh() //调用C++槽
4.使用枚举类型
Message头文件中
enum MESSAGE_COLOR {
MESSAGE_COLOR_YELLOW,
MESSAGE_COLOR_RED,
MESSAGE_COLOR_BLUE,
MESSAGE_COLOR_ALL
}; 由于需要在QML中调用C++枚举类型,需要用到Q_ENUMS()宏Q_ENUMS(MESSAGE_COLOR),在QML中使用枚举类型的方式是.,例如Message.MESSAGE_COLOR_ALL
5.使用信号槽
在上面提到的QML调用C++方法中,就说到了可以直接通过将函数定义为槽函数,然后直接供QML调用,下面主要讲述连接C++信号到QML槽
在Message类中定义信号 void sendresfresh(QDate sendvalue);这里信号定义为QData类型,形参为sendvalue
在QML槽函数中sendvalue为C++信号的形参,可以直接使用
Connections{ //连接C++信号到QML槽
target: msg2
onSendresfresh:{
var v=sendvalue.toString("yyyy/MM/dd");
console.log("C++ signal to Qml",v)
}
}
更多详见:
C++和QML混合编程(下):C++中调用QML
转载请注明出处:https://blog.csdn.net/qq_35173114/article/details/80873024
源码链接:https://download.csdn.net/download/qq_35173114/10511661