QWidget调用QML界面,并交互(下)

在上篇文章中,主要介绍了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",1,0,"SignalManager");        //信号中转类  //2..................
         import SignalManager 1.0
            SignalManager{                //2..................
       onSendSignalToQml:load(m_str)
   }

转载请标明出处:https://blog.csdn.net/qq_35173114/article/details/80978711
源码连接:https://download.csdn.net/download/qq_35173114/10531472

你可能感兴趣的:(QML,QWidget)