2017-05-06 24 views
1

QML信号をC++関数に接続したい。私はどのように私は適切なアイテムを得ることができるか分かりません。今、私は(簡単な方法があるでしょう、また?)動作していない次のようにそれを試して、ここで私が試したコードです: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

まず、あなたはこの記事をお読みください: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 
     } 
    } 
} 
+0

ありがとうございました。これはまさに私が望んでいたものです。私は#include も必要であることを言及したいと思います。 – numberCruncher

関連する問題