2013-06-04 5 views
0

I했습니다 다음 코드를 가지고 :QML의 C++ 신호 슬롯

QDeclarativeView *qmlView = new QDeclarativeView(); 
qmlView->setSource(QUrl("qrc:/nav.qml")); 
ui->nav->addWidget(qmlView); 
Blockschaltbild bild; 
QObject *value = qmlView->rootObject(); 
QObject::connect(value, SIGNAL(testSig()), &bild, SLOT(BlockSlot())); 

신호 슬롯이 제대로 연결

MAIN.CPP.

QML 파일을 (QObject를이 : "TRUE"을 리턴를 연결) :

Rectangle { 
    id: rectangle1 
    .... 
    signal testSig() 
    MouseArea{ 
     id: mousearea 
     anchors.fill: parent 
     onEntered: parent.color = onHoverColor 
     onExited: parent.color = parent.buttonColor 
     onClicked: { 
         rectangle1.testSig() 
         console.log("Button clicked") 
        } 
    } 
} 

이 슬롯이있는 곳입니다 :

Blockschaltbild.h

class Blockschaltbild: public QObject 
{ 
    Q_OBJECT 
public slots: 
    void BlockSlot(){ 
     cout << "Slot is working" << endl; 
    } 
public: 
    .... 
} 

을 마우스 영역을 클릭하면 "클릭 한 버튼"이 표시되지만 "슬롯이 작동 중"은 아닙니다. QtQuick 1.1과 함께 Qt 4.8.4를 사용합니다. 내 실수는 어디 갔지?

+0

'testSig()'대신'restSig()'를 쓴 오자입니까? 그리고 사각형은'id : rectangle1'을 가지고 있습니까? – leemes

+0

예, 오타였습니다. 방금 고쳤습니다. rectangle1은 직사각형의 ID입니다. 나는 거기에 그것을 쓰는 것을 잊어 버렸다. – shtdown

+0

Qt가 MOC 파일을 생성하고 cpp 파일과 링크하기 때문에 BlockSlot 정의를 .cpp 파일로 이동하십시오. – Dmitry

답변

0

QML에서 Blockschaltbild 개체를 사용하기 만하면 Signal과 Slot과의 느슨한 결합을 막을 수 있으며 개체를 컨텍스트 매개 변수로 전달하여 QML에서 사용할 수 있습니다.

QDeclarativeView *qmlView = new QDeclarativeView(); 
qmlView->setSource(QUrl("qrc:/nav.qml")); 
ui->nav->addWidget(qmlView); 

Blockschaltbild* bild; 
QObject *value = qmlView->engine().rootContext()->setContextProperty("bild", bild); 

당신은 다음과 QML에서 객체의 BlockSlot() 슬롯을 호출 할 수 있습니다

Rectangle { 
    id: rectangle1 
    .... 

    MouseArea{ 
     id: mousearea 
     anchors.fill: parent 
     onEntered: parent.color = onHoverColor 
     onExited: parent.color = parent.buttonColor 
     onClicked: { 
      bild.BlockSlot() // call BlockSlot of "bild" context property 
      console.log("Button clicked") 
     } 
    } 
} 

당신이 당신의 Blockschaltbild 클래스의 인스턴스를 만들 수 있습니다 qmlRegisterType를 사용하는 것도 가능하다 QML로 자세한 내용은 here을 참조하십시오.