QML c ++信号&插槽

时间:2013-06-04 10:50:23

标签: c++ qt qml signals-slots

我有以下代码:

的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 :: connect返回“true”)

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

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

1 个答案:

答案 0 :(得分: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);

然后,您可以使用以下命令从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")
        }
    }
}

也可以使用 qmlRegisterType ,它允许您使用QML创建Blockschaltbild类的实例。有关详细信息,请参阅here