我有以下代码:
的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。我的错误在哪里?
答案 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。