【问题标题】:Qt: Passing a slot to call into a QML TemplateQt:传递一个插槽以调用 QML 模板
【发布时间】:2016-01-13 16:29:07
【问题描述】:

我正在尝试在 Qt 中做某事,但我不确定这是否可行。我似乎找不到任何关于它的文档,或者任何其他人试图在网上做这件事,但我不想放弃,除非有人能确认这是不可能的。

我正在做的是创建一个 QML 模板,该模板将用于我的应用程序中的每个按钮。 QML 项目有几个属性和属性别名,当另一个 QML 文件使用模板时,这些属性和属性别名会定义按钮的工作方式。我想要做的是向模板传递一个插槽,以便在按下按钮时调用。

这是一个简单的模板示例以及它的工作原理:

Item {
    property variant onClickedAction
    property alias buttonImageSource: buttonImage.source

    Image {
        id: buttonImage
        MouseArea {
            anchors.fill: parent
            onClicked: onClickedAction()
        }
    }
}

下面是另一个 QML 文件如何使用该按钮模板(称为 ExampleButtonTemplate.qml)的示例:

ExampleButtonTemplate {
    onClickedAction: ExampleSlot()
    buttonImageSource: "ExampleImage.png"
}

但是,当我尝试这种方式时,它只会在加载使用模板的页面时调用插槽,而不是在按下按钮时调用。必须有某种方法可以通过属性将稍后要调用的函数从一个 QML 文件传递​​到另一个。如果有人可以解释一种方法来做到这一点或确认不可能像这样传递插槽,那将是一个很大的帮助。

【问题讨论】:

  • 我还想提一下,我意识到 Qt 提供了他们自己的按钮模板,但他们并没有涵盖我需要的按钮的所有不同可能性,这就是我制作自己的原因。跨度>
  • 看看this。这是通常的方式。

标签: c++ qt qml


【解决方案1】:

更新:我这样做是为了让它工作: 替换:

property variant onClickedAction

与:

property var onClickedAction

并替换:

onClickedAction: ExampleSlot()

与:

onClickedAction: ExampleSlot

【讨论】:

    【解决方案2】:

    虽然这当然是可能的,但为什么不只是“转发”信号并像在使用地点一样处理它?

    基本上只是在最外面的项目上添加一个信号

    Item {
        id: button
        signal clicked()
    
        Image {
            MouseArea {
                onClicked: button.clicked()
            }
        }
    }
    

    然后你可以像使用任何内置信号一样使用它

    ExampleButtonTemplate {
        onClicked: exampleSlot()
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-10
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多