首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QML信号连接

QML信号连接
EN

Stack Overflow用户
提问于 2014-10-11 11:26:05
回答 2查看 9.5K关注 0票数 2

我开始用QML编写应用程序(使用QML 1.1和QT4.8.1),我有一些关于信号的问题。在我的项目中有以下文件:

main.qml:

代码语言:javascript
复制
Rectangle {
    signal sigExit()
    width: 800
    height: 600
    Text {
        text: qsTr("Hello World")
        anchors.centerIn: parent
    }
    MouseArea {
        anchors.fill: parent
        onClicked: {
            sigExit();
            Qt.quit();
        }
    }
    Button
    {
        x: 10
        y: parent.height-height-5
        text: "someText"
    }
}

Button.qml:

代码语言:javascript
复制
Rectangle {
    signal buttonsig()
    width: 60
    //(...)
    MouseArea
    {
        anchors.fill: parent
        onClicked: buttonsig();
    }
}

当我想将信号从main.qml连接到C++插槽时,我需要:

main.cpp:

代码语言:javascript
复制
QmlApplicationViewer viewer;
viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto);
viewer.setMainQmlFile(QLatin1String("qml/MyProject/main.qml"));
viewer.showExpanded();

MyClass* obj = new MyClass;
QObject* item = qobject_cast<QObject*>(viewer.rootObject());
QObject::connect(item, SIGNAL(sigExit()), obj, SLOT(onExitWindow()));

而且起作用了。但是,当我想将sigbutton()Button.qml连接到C++插槽时怎么办?会是这样的吗?

代码语言:javascript
复制
QObject *rect = item->findChild<QObject*>("Button");
QObject::connect(rect, SIGNAL(buttonsig()), obj, SLOT(onExitWindow()));

第二个问题:如何将sigbutton()连接到main.qml (例如,单击按钮后要更改按钮的位置)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-11 11:43:13

如果要访问Button项,还需要有它的Button属性:

代码语言:javascript
复制
Button {
    id: myButton
    objectName: "myButton"
    x: 10
    y: parent.height-height-5
    text: "someText"
}

现在您可以通过以下方式访问它:

代码语言:javascript
复制
QObject *rect = item->findChild<QObject*>("myButton");

关于第二个问题,您可以使用Connections对象将buttonsig()连接到main.qml中的某些QML信号处理程序:

代码语言:javascript
复制
Rectangle {
    signal sigExit()
    width: 800
    height: 600

    Connections{
        target: myButton
        onButtonsig :
        {
            ...
        }
    }

    Text {
        text: qsTr("Hello World")
        anchors.centerIn: parent
    }
    MouseArea {
        anchors.fill: parent
        onClicked: {
            sigExit();
            Qt.quit();
        }
    }
    Button
    {
        id: myButton

        x: 10
        y: parent.height-height-5
        text: "someText"
    }
}

注意,信号处理程序的名称应该是on<Signal> (第一个信号字母大写字母)。另外,Button应该有一个id来在Connections中处理它。

票数 1
EN

Stack Overflow用户

发布于 2014-10-11 11:53:14

访问加载的qml元素、转换它们并将它们的信号连接到您的C++插槽是完全可能的。但是,在您的生产代码中应该避免使用这种方法。请参见Qt文档中的警告。

那么,从qml端调用C++时隙的方法是什么呢?您可以将需要使用qml引擎作为上下文属性调用其插槽的对象注册。注册后,这些上下文属性可以从QML端访问任何地方。

可以在QML example: onClicked:{<contextPropertyName>.<slotName>()}中的信号处理程序中直接调用注册为上下文属性的对象的槽。

或者,可以使用Connections类型将QML信号与上下文属性对象的槽直接连接起来。请参阅这份文件

有关注册上下文属性的详细信息,请参阅使用上下文属性将C++对象嵌入到QML中。

如果你想看一些例子,请看我对这些问题的回答。Qt信号和插槽-什么都不会发生从C++设置QML中的对象类型属性

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26314111

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档