QML和C ++连接到信号

时间:2017-05-06 16:04:20

标签: c++ qml qtquick2

我想将QML信号连接到c ++函数。我真的不明白我怎么能得到合适的物品。现在我用以下方式尝试它,这是不行的(另外,有更简单的方法吗?),这是我尝试的代码:

main.cpp中:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "include/myclass.h"

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

    QQmlApplicationEngine engine;
    engine.load(QUrl(QLatin1String("qrc:/main.qml")));

    QQmlComponent component(&engine, "qrc:/Page1.qml");
    QObject *item = component.create();
    MyClass myClass;
    QObject::connect(item, SIGNAL(testSignal()),&myClass,SLOT(cppSlot()));

    return app.exec();
}

main.qml:

import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.0

ApplicationWindow {
    visible: true
    width: 800
    height: 460

    Page1 {
        id: page1
        visible: true
    }
}

Page1.qml:

import QtQuick 2.7
import QtQuick.Window 2.2

Item {
    width: 800
    height: 460

    signal testSignal()

    CustomButton {
        id: cppSignalButton
        x: 14
        y: 55
        buttonText: "Test CPP Signal"
        onButtonClicked: {
            testSignal();
        }
     }
}

CustomButton.qml:

import QtQuick 2.7
import QtQuick.Window 2.2


Rectangle {
    id: root
    width: 200
    height: 50
    color: "#000000"
    border.color: "#FFFFFF"

    property string buttonText
    signal buttonClicked()

    MouseArea {
        id: mouseArea
        anchors.fill: parent

        onClicked:{
            root.buttonClicked();
        }

    }
        Text {
            id: text1
            x: 105
            y: 31
            color: "#ffffff"
            text: buttonText
            anchors.verticalCenter: parent.verticalCenter
            anchors.horizontalCenter: parent.horizontalCenter
            font.pixelSize: 20
        }
}

和myclass.cpp:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <iostream>
#include <fstream>
#include <QQuickItem>
#include <QQuickView>

class MyClass : public QObject
{
    Q_OBJECT
public:
    MyClass(){

    };
public slots:
    void cppSlot() {
        std::ofstream textfile;
        textfile.open("test.txt");
        textfile << "Signal worked" << std::endl;
        textfile.close();
        qInfo( "Called the C++ slot" );
    }
};

1 个答案:

答案 0 :(得分:1)

首先,您应该阅读这篇文章:Integrating QML and C++

您可以通过以下方式从qml调用MyClass对象方法:

// main.cpp中

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include "include/myclass.h"

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

    QQmlApplicationEngine engine;
    MyClass myClass;
    engine.rootContext()->setContextProperty("myClass", &myClass);
    engine.load(QUrl(QLatin1String("qrc:/main.qml")));



    return app.exec();
}

// Page1.qml

import QtQuick 2.7
import QtQuick.Window 2.2

Item {
    width: 800
    height: 460

    signal testSignal()

    CustomButton {
        id: cppSignalButton
        x: 14
        y: 55
        buttonText: "Test CPP Signal"
        onButtonClicked: {
            myClass.cppSlot(); //now you can use the context property to invoke your slot
        }
     }
}