按下鼠标时不会更新 QML 图像源

Posted

技术标签:

【中文标题】按下鼠标时不会更新 QML 图像源【英文标题】:QML Image source is not updated while mouse is pressed 【发布时间】:2018-05-30 15:52:51 【问题描述】:

我有 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 一切都按预期工作。

【问题讨论】:

您必须定义states 以及state。拥有state 只是没有意义。顺便说一句,您代码中信号的定义也不正确。 我试图定义状态。它没有帮助。仅当鼠标按钮按下时才会发生,当我释放按钮时图像会更新。 我什至尝试定义一个重复计时器,它可以切换图像。它工作得很好,但是当我将光标移动到该项目并按下鼠标按钮时,计时器停止工作几秒钟。奇怪的原因是我在这个实验中删除了鼠标区域。 我也尝试在状态改变后从cpp桥调用update,也没有帮助。 你能发布你的整个代码吗?有工作和不工作的例子。你的例子对我来说很好。您的信号声明或使用state 没有问题(即使state 确实通常意味着与statesPropertyChanges 一起使用)。 【参考方案1】:

我发现了问题。我在主窗口中使用QOpenGLWidget。我在paintGL中调用了update方法。

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

我用计时器替换了更新调用,每 1000 / 60 毫秒运行一次。 问题消失了。奇怪的是它只有在按下鼠标按钮时才会重现,否则一切都会正确更新。

【讨论】:

以上是关于按下鼠标时不会更新 QML 图像源的主要内容,如果未能解决你的问题,请参考以下文章

鼠标按下或基于鼠标按钮更新控制光标

为啥鼠标右键单击在按下时会触发“pointerdown”事件,但在释放时不会触发“pointerup”事件?

WPF 鼠标按下事件不会触发

QML事件处理 八

如何检测fabric js动画对象上的鼠标按下事件

QML 键盘事件