Не удалось подключить сигнал Qml к слоту C ++ - PullRequest
0 голосов
/ 07 июня 2018

Я пытался соединить сигнал между файлом Qml и c ++, но общедоступный слот в c ++, похоже, не получает сигнал.Что может быть не так с моей программой?

main.qml

Item{
    id:item
    signal qml_signal
    Button{
        onClicked: {
            item.qml_signal();
        }
    }
}

main.cpp

QQuickView view(QUrl("qrc:/main.qml"));
QObject *item = view.rootObject();
Myclass myclass;
QObject::connect(item, SIGNAL(qml_signal()), &myclass,SLOT(cppSlot()));

myclass.h

void cppSlot() ;

myclass.cpp

void Myclass::cppSlot(){
    qDebug() << "Called the C++ slot with message:";
}

1 Ответ

0 голосов
/ 07 июня 2018

Когда вы хотите, чтобы объекты взаимодействовали между C ++ и QML, вы должны сделать это на стороне QML, поскольку получение объекта QML из C ++ может вызвать много проблем, так как в этом случае сигнал, созданный в QML, не может быть обработанв C ++.

Решение состоит в том, чтобы экспортировать ваш объект myclass в QML и установить соединение там:

main.cpp

#include "myclass.h"

#include <QGuiApplication>
#include <QQuickView>
#include <QQmlContext>

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

    QGuiApplication app(argc, argv);

    QQuickView view(QUrl("qrc:/main.qml"));
    Myclass myclass;
    view.rootContext()->setContextProperty("myclass", &myclass);

    view.show();
    return app.exec();
}

main.qml

import QtQuick 2.9
import QtQuick.Controls 1.4

Item{
    id:item
    signal qml_signal
    Button{
        onClicked: item.qml_signal()
    }
    onQml_signal: myclass.cppSlot()
}
...