在上篇文章中,主要介绍了QWdiget与QML交互的常规方法,本文主要介绍C++中调用元对象方法QMetaObject::invokeMethod()以及通过单例和信号中转类实现交互:
invokeMethod方法:
获取qml的根节点对象,然后调用方法,invoke主要有对象,方法和返回值,输入值参数。
widget.cpp:
QQuickItem *item=ui->quickWidget->rootObject();
if(item)
QMetaObject::invokeMethod(item,"load",Q_ARG(QVariant,ui->lineEdit->text()));
qmlTest.qml:
function load(str)
{
m_txt.text=str
}
通过调用元对象方法设置qml对应函数。
创建Widget单例
1。定义单例Widget
widget.h中
private:
static Widget* p_Instance;
static QMutex m_mutex;
public:
static Widget * GetInstance();
widget.cpp中
Widget* Widget::p_Instance=NULL;
QMutex Widget::m_mutex;
Widget *Widget::GetInstance()
{
if(Q_NULLPTR==p_Instance)
{
m_mutex.lock();
if(Q_NULLPTR==p_Instance)
{
p_Instance=new Widget();
m_mutex.unlock();
}
}
return p_Instance;
}
2。创建信号中转类SignalManager,用于将Widget单例对象的信号和槽连接起来,在槽里面再发送信号
sendSignalToQml(str)
connect(Widget::GetInstance(),&Widget::sendSignalToXml,this,&SignalManager::sendSignalToQmlSlot);
3.将信号中转类SignalManager在main.cpp中注册,这样在QML中实例信号中转类SignalManager的时候,就会将单例对象Widget的信号和中转类连接起来,这样做的好处是能够将QML文件作为资源调用,并且信号和槽分开管理
qmlRegisterType<SignalManager>("SignalManager",1,0,"SignalManager"); //信号中转类 //2..................
import SignalManager 1.0
SignalManager{ //2..................
onSendSignalToQml:load(m_str)
}
转载请标明出处:https://blog.youkuaiyun.com/qq_35173114/article/details/80978711
源码连接:https://download.youkuaiyun.com/download/qq_35173114/10531472