如何将qml子组件信号连接到c ++插槽

时间:2014-08-05 06:56:12

标签: c++ qt qml

我想将子项目组件信号连接到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 ++插槽,它工作正常。

2 个答案:

答案 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)));
}