我想将子项目组件信号连接到c ++插槽,但它无法正常工作。我有一个文件 ButtonItem.qml ,代码就像
Item {
id: button
property string label
property alias cellColor : rectangle.color
Rectangle {
id : rectangle
objectName : "rectangle"
height : 40
width : 50
radius: 10
color: "gray"
Text {
anchors.centerIn: parent
font.pixelSize: 20
text: button.label
color: "white"
}
}
}
,主文件是 的 button.qml
Rectangle {
id : rect
width: systemWidth
height: systemHeight.getHeight()
Text{
id : text
objectName : "text"
height : 20
width : 10
anchors.centerIn : parent
text : systemHeight.getText()
}
ButtonItem {
signal qmlMsg(string msg)
objectName : "button"
id : button3
cellColor : "blue"
label : "3"
MouseArea {
anchors.fill : parent
onClicked : button3.qmlMsg("Hello World")
}
}
}
在我的主要源文件中,代码为
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent)
{
QDeclarativeView *qmlView = new QDeclarativeView;
qmlView->rootContext()->setContextProperty("systemWidth", 1000);
Sample sObj;
qmlView->rootContext()->setContextProperty("systemHeight", &sObj);
this->setCentralWidget(qmlView);
qmlView->setSource(QUrl::fromLocalFile("E:/samplecode/qmlsample/button.qml"));
QObject *obj = qmlView->rootObject();
QObject *childObj = obj->findChild<QObject *>("button");
connect(childObj, SIGNAL(qmlMsg(QString)), this, SLOT(printData(QString)));
}
void MainWindow::printData(QString message)
{
qDebug()<<message;
}
但没有插槽正在接听电话。 如果我将父信号连接到c ++插槽,它工作正常。
答案 0 :(得分:1)
问题不在于孩子的信号/插槽,而是MouseArea,其大小为零。将宽度和高度添加到 ButtonItem.qml 中的根项目。
Item {
id: button
width: 40 // add this
height: 40 // add this
...
}
或者您将它们直接添加到 button.qml
ButtonItem {
signal qmlMsg(string msg)
objectName : "button"
id : button3
cellColor : "blue"
label : "3"
width: 40 // add this
height: 40 // add this
...
}
答案 1 :(得分:0)
要使用QObject::findChild()
查找QML子项,它应该有一个名称。所以应该是这样的:
Item {
id: button
objectName: "button"
...
}
现在您可以通过以下方式访问它:
QObject *obj = qmlView->rootObject();
QObject *childObj = obj->findChild<QObject *>("button");
if (childObj)
{
connect(childObj, SIGNAL(qmlMsg(QString)), this, SLOT(printData(QString)));
}