2

我创建了一个基于 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 代码将根本无法工作。很抱歉这么晚才回来,这是一个非常忙碌的一周,很抱歉浪费了带宽。感谢您提供出色的调试建议以及供将来参考!

4

1 回答 1

3

我不知道您对ButtonQtQuick.Controls 2.0 的问题 - 它对我来说非常有效。

使用您自己的实现MyButton,这对我也不起作用。

原因是这visible: false将停用MouseArea(及其所有子级) - 设置enabled: true不会改变这一点。
无论如何设置visible: false都是不必要的,因为 aMouseArea没有什么可渲染的——实际上是不可见的。

更改后,您应该会收到警告:

Error: Insufficient arguments

当您调用需要参数 ( )的信号clicked时。要调用您的自定义信号,请改为调用.RMouseAreaMouseEventbutton.clicked()


如果您仍然没有得到任何信息,则需要采取进一步的调试步骤。

  1. 检查您是否可以使用console.log例如添加Component.onComplete: console.log("Output works")到您的对象之一来生成任何输出。

  2. Rectangle通过更改单击时的颜色来检查您的输入是否真的被破坏MouseAreacolor: (mouseArea.pressed ? 'red' : 'green')

  3. 如果已注册,则将 an安装eventFilter到您的QGuiApplication(在 C++ 中)将打印某些内容。MouseEvent

于 2017-12-04T23:41:43.093 回答