0

我有以下代码:

主文件

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 返回“真”)

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

如果我点击鼠标区域,控制台会显示“Button clicked”而不是“Slot is working”。我使用 Qt 4.8.4 和 QtQuick 1.1。我的错误在哪里?

4

1 回答 1

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 类的实例。请参阅此处了解更多信息。

于 2018-03-09T09:50:21.797 回答