qml 按钮不触发,与 MouseArea 相同
Posted
技术标签:
【中文标题】qml 按钮不触发,与 MouseArea 相同【英文标题】:qml button not firing, same with MouseArea 【发布时间】:2017-12-04 22:27:25 【问题描述】:我创建了一个基于 Qt 5.9.3 的新 QML 项目。我设置了一个带有按钮的简单 ApplicationWindow 以及我自己的按钮(MyButton),但我从来没有让 onClicked() 事件(显然)为它们中的任何一个触发。弹出我的应用程序窗口,显示 2 个按钮。单击其中任何一个都不会在我的控制台输出中显示任何内容。
如果这很重要,我还会在 .pro 文件中预编译我的 qml 源文件。我在启动时收到一些字体错误,我在 C++ 中修复了这些错误 得到一些字体,这样我就可以看到一些东西,除此之外没有 错误或警告。我花了几个小时试图得到一个简单的 鼠标单击事件没有运气。
感谢任何帮助。
这是我的 main.qml:
import QtQuick 2.7
import QtQuick.Controls 2.0
ApplicationWindow
visible: true
width: 640
height: 480
title: "App Title"
color: "white"
Button
text: "Button"
onClicked:
console.log("clicked")
MyButton
anchors.right: parent.right
anchors.top: parent.top
onClicked:
console.log("my button clicked")
和 MyButton.qml
import QtQuick 2.7
Rectangle
id: button
width: 100
height: 50
color: "yellow"
signal clicked()
MouseArea
id: mouseArea
anchors.fill: button
visible: false
enabled: true
onClicked:
console.log("my button mouse clicked")
clicked()
更新:我做了一件非常愚蠢的事情。在我做的 main.cpp 文件中 不包括我认为我会更干净并移动我的 QQmlEngine 初始化代码 进入自己的单独方法。当然,当引擎参考去了 超出范围导致了我的问题。我没有看那里,因为我错误地认为如果那里出现问题,qml 代码将根本无法工作。很抱歉这么晚才回来,这是一个非常忙碌的一周,很抱歉浪费了带宽。感谢您提供出色的调试建议,以供将来参考!
【问题讨论】:
【参考方案1】:我不知道您对 QtQuick.Controls 2.0 中的 Button
的问题 - 它对我来说非常有效。
使用您自己实现的MyButton
,这对我也不起作用。
原因是visible: false
将停用MouseArea
(及其所有子代)- 设置enabled: true
不会改变这一点。
无论如何设置visible: false
是不必要的,因为MouseArea
没有什么可渲染的——实际上是不可见的。
更改后,您应该会收到警告:
Error: Insufficient arguments
当您调用需要参数 (MouseEvent
) 的 MouseArea
的信号 clicked
时。要调用您的自定义信号,请改为调用button.clicked()
。R
如果您仍然没有得到任何结果,则需要采取进一步的调试步骤。
检查您是否可以使用console.log
生成任何输出,例如通过将Component.onComplete: console.log("Output works")
添加到您的对象之一。
通过在单击MouseArea
时更改Rectangle
的颜色来检查您的输入是否真的损坏:color: (mouseArea.pressed ? 'red' : 'green')
将eventFilter
安装到您的QGuiApplication
(C++ 中),如果注册了MouseEvent
,它将打印一些内容。
【讨论】:
感谢您的提示,如果父项设置为 visible=false,则 MouseArea 将完全停用。再次将父项设置为 visible=true 后,MouseArea 不会自动激活。它也必须设置为 visible=true。以上是关于qml 按钮不触发,与 MouseArea 相同的主要内容,如果未能解决你的问题,请参考以下文章
覆盖 QML 行的 MouseArea(或自动调整大小的图像+文本)
qt qml。 MouseArea 可以看到事件,但将它们全部传递给父级而不影响它们吗?