Кнопка qml не срабатывает, то же самое с MouseArea

Я создал новый проект QML на основе Qt 5.9.3. Я устанавливаю простой ApplicationWindow с помощью кнопки, а также свою собственную кнопку (MyButton), и я никогда не получаю событие onClicked() для запуска (очевидно) ни для одного из них. Окно моего приложения всплывает с двумя кнопками. Нажатие на любой из них ничего не показывает в выводе моей консоли.

Я также предварительно компилирую свои исходные файлы qml в файл .pro, если это вообще имеет значение. Я получаю некоторые ошибки шрифта при запуске, которые я исправляю в С++, чтобы заставить работать некоторые шрифты, чтобы я мог что-то увидеть, кроме того, что ошибок или предупреждений нет. Я потратил пару часов, просто пытаясь получить простое событие щелчка мыши, но безуспешно.

Любая помощь приветствуется.

Вот мой 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 вообще не будет работать, если что-то там не так. Извините, что возвращаюсь к этому так поздно, это была очень напряженная неделя, и извините за потраченную впустую полосу пропускания. Спасибо за отличные предложения по отладке, а также за будущие ссылки!


person Tim    schedule 04.12.2017    source источник


Ответы (1)


Я не знаю о вашей проблеме с Button из QtQuick.Controls 2.0 - у меня он отлично работает.

С вашей собственной реализацией MyButton у меня это тоже не работает.

Причина в том, что visible: false деактивирует MouseArea (и всех его дочерних элементов) - установка enabled: true этого не изменит.
Установка visible: false в любом случае не нужна, так как MouseArea нечего отображать - она ​​фактически невидима.

После того, как вы изменили это, вы должны получить предупреждение:

Error: Insufficient arguments

как вы вызываете сигнал clicked из MouseArea, который требует аргумента (MouseEvent). Чтобы вызвать собственный сигнал, вместо этого вызовите button.clicked().R


Если вы по-прежнему ничего не получаете, вам нужно будет предпринять дальнейшие шаги по отладке.

  1. Проверьте, можете ли вы сгенерировать какой-либо вывод, используя console.log, например, добавив Component.onComplete: console.log("Output works") к одному из ваших объектов.

  2. Проверьте, действительно ли ваш ввод неисправен, изменив цвет Rectangle при нажатии на MouseArea: color: (mouseArea.pressed ? 'red' : 'green')

  3. Установите eventFilter в свой QGuiApplication (на C++), который будет что-то печатать, если MouseEvent зарегистрирован.

person derM    schedule 04.12.2017
comment
Спасибо за подсказку, что MouseArea полностью деактивируется, если для родительского элемента установлено значение visible=false. После повторной установки для родительского элемента значения visible=true MouseArea не активируется автоматически. Он также должен быть установлен visible=true. - person solarisx; 22.11.2019