2013-06-04 274 views
0

我有以下代码:QML C++信号&槽

的main.cpp

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())); 

的信号和槽正确连接。 (的QObject ::连接返回 “真”)

QML文件:

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: 
    .... 
} 

如果我点击鼠标区域,控制台显示“按钮点击”,但不显示“插槽正在工作”。 我使用Qt 4.8.4和QtQuick 1.1。我的错误在哪里?

+0

这是你写错了'restSig()'而不是'testSig()'的错字吗?矩形是否有'id:rectangle1'? – leemes

+0

是的,这是一个错字。我只是纠正它。 rectangle1是矩形的id。我忘了写在那里。 – shtdown

+0

尝试将BlockSlot定义移动到.cpp文件,因为Qt将生成MOC文件并将其与cpp文件链接。 – Dmitry

回答

0

如果您只需要在QML中处理Blockschaltbild对象,则还可以决定使用信号和插槽进行松散耦合,并简单地将对象作为上下文参数传递,以使其可以在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); 

然后,您可以打电话给你的对象BlockSlot()槽从QML有:

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") 
     } 
    } 
} 

也可以使用qmlRegisterType,它允许你创建Blockschaltbild类的实例与QML。有关更多信息,请参见here