簡體   English   中英

Qt C++ 信號到 Qml

[英]Qt C++ Signal to Qml

我試圖在 Qml 中捕獲 C++ Qt 信號。 我能夠發送信號,並且在 Qt 中捕獲 Qml 信號也在工作; 但是,我無法在 Qml 中捕捉到 Qt 信號。

我需要哪個 QObject::connect?

最小的 main.cpp:

    #include <QtGui/QGuiApplication>
    #include <QtQml/QQmlApplicationEngine>
    #include <QQmlContext>
    #include <QQuickWindow>
    
    #include "qmlcppapi.h"

    int main(int argc, char *argv[])
    {
        QGuiApplication app(argc, argv);
        qmlRegisterType<QmlCppApi>("com.handleQmlCppApi",1,0,"HandleQmlCppApi");
        QQmlApplicationEngine engine;
        const QUrl url(QStringLiteral("qrc:/qml/qmlfile.qml"));
        QmlCppApi api;
        engine.rootContext()->setContextProperty("api", &api);
        engine.load(url);
        QObject::connect(&api, &QmlCppApi::testStringSended,
                         &api, &QmlCppApi::printTestString);
        return app.exec();
    }

最小 gmlcppapi.hpp:插槽僅用於顯示是否發出信號

    #ifndef QMLCPPAPI_H
    #define QMLCPPAPI_H
    
    #include <QObject>
    #include <QDebug>
    
    class QmlCppApi : public QObject
    {
        Q_OBJECT
    
    public:
        Q_INVOKABLE void postTestString(QString TestString) {
            qDebug() << "cpp: recieved";
            emit testStringSended(TestString);
        }
    
    public slots:
        void printTestString(QString TestString) {
            qDebug() << "cpp: sended";
        }
    
    signals:
        void testStringSended(QString TestString);
    };
    
    #endif // QMLCPPAPI_H

最小 qmlfile.qml:ToggleButton 應該執行 cpp function testStringSended。 並且 printTestString 正在觸發一個應該觸發 onTestStringSended 的發射

    import QtQuick 2.2
    import QtQuick.Window 2.1
    import QtQuick.Controls 1.4
    import QtQuick.Controls.Styles 1.4
    import QtQuick.Extras 1.4
    import com.handleQmlCppApi 1.0
    
    Window {
        visible: true
        ToggleButton {
            onClicked: {
                console.log("send")
                api.postTestString("TestString")
            }
        }
    
        HandleQmlCppApi {
            onTestStringSended: console.log("recieved")
        }
    }

output:

qml: send
cpp: recieved
cpp: sended

為什么我的 Qml 收不到信號?

您有兩個創建的 QmlCppApi 實例。 一個在 main.cpp 中,你稱之為api ,另一個在 QML 中,它是未命名的 HandleQmlCppApi object。 你只需要其中之一。 要捕獲來自api的信號,您需要一個Connections object,如下所示:

Connections {
    target: api

    onTestStringSended: console.log("recieved")
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM