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 可以看到事件,但将它们全部传递给父级而不影响它们吗?

QML:从动态 MouseArea 中“窃取”事件

QML MouseArea - 检查 Qt.NoModifier

QML-在 MouseArea 中未检测到右键单击

QML 鼠标事件