Источник изображения QML не обновляется при нажатии мыши

У меня есть ImageButton.qml, который должен менять изображение, когда пользователь держит кнопку.

import QtQuick 2.0

Image {
    id: svg

    property string idleImage
    property string hoverImage

    signal clicked

    state: "idle"

    source: state === "idle" ? idleImage : hoverImage

    onSourceChanged: {
        console.log("source = " + source)
    }

    MouseArea {
        id: mouseArea
        anchors.fill: parent
        acceptedButtons: Qt.LeftButton

        onPressedChanged: {
            svg.state = pressed ? "hover" : "idle"
        }

        onClicked: svg.clicked()
    }
}

Но образ меняется не сразу. Меняется только когда держу кнопку несколько секунд. Когда я сразу же нажимаю и отпускаю кнопку мыши, я никогда не вижу изображение при наведении. onSourceChanged выполняется немедленно и выводит на консоль правильный источник изображения. Эта странная ошибка возникает только тогда, когда я использую QQuickWidget. Когда я не использую виджеты, а только qml, все работает как положено.


person Semyon Tikhonenko    schedule 30.05.2018    source источник
comment
Вы должны определить states, а также state. иметь только state смысла нет. Кстати, определение сигнала в вашем коде тоже неверно.   -  person folibis    schedule 31.05.2018
comment
Я пытался определить состояния. Это не помогает. Это происходит только тогда, когда кнопка мыши нажата, когда я отпускаю кнопку, изображение обновляется.   -  person Semyon Tikhonenko    schedule 31.05.2018
comment
Я даже пытался определить повторяющийся таймер, который переключает изображение. Это работает хорошо, но когда я подвожу курсор к элементу и нажимаю кнопку мыши, таймер перестает работать на несколько секунд. Это странно, потому что я удалил область мыши в этом эксперименте.   -  person Semyon Tikhonenko    schedule 31.05.2018
comment
И я также пытался вызвать обновление из моста cpp после изменения состояния, и это тоже не помогает.   -  person Semyon Tikhonenko    schedule 31.05.2018
comment
Не могли бы вы опубликовать весь код? С рабочим и не рабочим примером. Ваш пример отлично работает для меня. Нет проблем с объявлением вашего сигнала или использованием state (даже если state действительно обычно используется с states и PropertyChanges).   -  person augre    schedule 31.05.2018
comment
@augre Это работает для вас, когда вы помещаете qml в QQuickWidget?   -  person Semyon Tikhonenko    schedule 31.05.2018
comment
да. Может быть, я могу помочь, но мне нужно увидеть ваш код.   -  person augre    schedule 31.05.2018


Ответы (1)


Я нашел проблему. Я использую QOpenGLWidget в MainWindow. И я вызвал метод обновления в paintGL.

void Workspace::paintGL() {
    QOpenGLWidget::paintGL();
    workspaceDrawer.draw();
    update();
}

Я заменил вызов обновления таймером, запускающимся каждые 1000/60 миллисекунд. И проблема исчезла. Странно, что воспроизводилось только при нажатии кнопки мыши, в остальном все корректно обновлялось.

person Semyon Tikhonenko    schedule 01.06.2018