首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QML PinchArea与QML Flickable不能正常工作

QML PinchArea与QML Flickable不能正常工作
EN

Stack Overflow用户
提问于 2019-08-15 07:12:16
回答 1查看 1.3K关注 0票数 3

因此,我实现了一个简单的图像查看器,并希望实现在Flickable中进行缩放。在看了几个示例之后,我偶然发现了this,并认为我可以做一些类似的事情。然而,当我测试代码(Android上的Qt 5.13 )时,它并没有像预期的那样工作。问题是,当图像被缩放时,PinchArea停止工作,用户无法缩小,而Flickable仍然允许“轻弹”图像(在该缩放级别)。以下是代码,我找不到其中的任何错误:

代码语言:javascript
复制
import QtQuick 2.7
import QtQuick.Controls 2.0
import QtQuick.Layouts 1.0

ApplicationWindow {
    visible: true
    width: 640
    height: 480
    title: qsTr("Flickable Image Zoom Example")

    Page {
        id: imagePage

        property string imgUrl: "qrc:/messi.jpg"
        property string strHpTitle: ""
        property string strThumbnailUrl: ""

        anchors.fill: parent
        Flickable {
            id: imageFlickable
            anchors.fill: parent
            contentWidth: imageContainer.width; contentHeight: imageContainer.height
            clip: true
            onHeightChanged: if (imagePreview.status === Image.Ready) imagePreview.fitToScreen();

            Item {
                id: imageContainer
                width: Math.max(imagePreview.width * imagePreview.scale, imageFlickable.width)
                height: Math.max(imagePreview.height * imagePreview.scale, imageFlickable.height)

                Image {
                    id: imagePreview

                    property real prevScale

                    function fitToScreen() {
                        scale = Math.min(imageFlickable.width / width, imageFlickable.height / height, 1)
                        pinchArea.minScale = scale
                        prevScale = scale
                    }

                    anchors.centerIn: parent
                    fillMode: Image.PreserveAspectFit
                    cache: false
                    asynchronous: true
                    source: imagePage.imgUrl
                    sourceSize.height: 1000;
                    smooth: !imageFlickable.moving

                    onStatusChanged: {
                        if (status == Image.Ready) {
                            fitToScreen()
                        }
                    }
                    onScaleChanged: {
                        if ((width * scale) > imageFlickable.width) {
                            var xoff = (imageFlickable.width / 2 + imageFlickable.contentX) * scale / prevScale;
                            imageFlickable.contentX = xoff - imageFlickable.width / 2
                        }
                        if ((height * scale) > imageFlickable.height) {
                            var yoff = (imageFlickable.height / 2 + imageFlickable.contentY) * scale / prevScale;
                            imageFlickable.contentY = yoff - imageFlickable.height / 2
                        }
                        prevScale = scale
                    }
                }
            }

            PinchArea {
                id: pinchArea

                property real minScale: 1.0
                property real maxScale: 3.0

                anchors.fill: parent
                pinch.target: imagePreview
                pinch.minimumScale: minScale
                pinch.maximumScale: maxScale
                pinch.dragAxis: Pinch.XandYAxis

                onPinchFinished: {
                    imageFlickable.returnToBounds()
                }
            }
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-16 02:09:55

好了,我找到了这个问题的解决方案。这个问题(我认为)是由一个bug引起的。出于某种奇怪的原因,我代码中的FlickablePinchArea中窃取了触摸事件,因此挤压触摸事件被忽略并传递到Flickable上。为了解决这个问题,我找到了一个解决办法,就是在PinchArea中创建一个MouseArea,这样PinchArea就可以接收触摸事件,这样Flickable就不会窃取它们。因此,通过解决方法,我的代码具有以下结构:

代码语言:javascript
复制
Flickable{
   PinchArea{
      MouseArea{ anchors.fill: parent} // this is the workaround
   }
   Item{}
}

我已经报告了bug here,并上传了一个小视频来说明原因。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57503125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档