1

我有Flickable一个孩子CanvasImage。我正在单击按钮将图像加载到source中。Image这一切都有效。问题是 flickable 不会将其尺寸刷新为图像的尺寸,因此整个图像是“flickable”的,我可以滚动它(它比可视窗口大)。但是,如果我调整窗口大小,它会刷新,然后我可以在图像周围轻弹。

我猜这是因为正在重绘窗口,并且 qml 正在重新读取img.widthimg.height值以重绘Flickable.

(仅供参考,如果我在启动应用程序时加载图像,Flickable 按预期工作,只有当我在单击按钮时加载图像,一旦应用程序运行,窗口需要重绘(或调整大小)才能Flickable工作正如预期的那样

Flickable {
    id: flickableCanvas
    anchors.fill: parent
    Item {
        id: source
        width: Math.max(parent.width,img.width)
        height: Math.max(parent.height,img.height)
    Image
    {
        id: img
    }
    Canvas {
        id: myCanvas
        }
    }
}

Connections {
    target: QmlBridge
    onLoadImage: {
        img.source = p
        myCanvas.requestPaint()
        flickableCanvas.contentWidth = img.width
        flickableCanvas.contentHeight = img.height
    }

}
4

1 回答 1

1

看起来您正试图在图像加载之前访问它的width/ 。height

您应该在组件下移动您的 Flickable contentWidth/ contentHeightassignment Image

Image {
    id: im
    onStatusChanged: {
        if (status === Image.Ready) {
            flickableCanvas.contentWidth = img.width
            flickableCanvas.contentHeight = img.height
        }
    }
}

// ...

Connections {
    target: QmlBridge
    onLoadImage: {
        img.source = p
        myCanvas.requestPaint()
        // flickableCanvas.contentWidth = img.width
        // flickableCanvas.contentHeight = img.height
    }

}

但我认为您甚至不必手动设置这些属性。您可以通过将它们绑定到您的img宽度/高度来做更简单的事情:

Flickable {
    id: flickableCanvas
    anchors.fill: parent
    contentWidth: img.width // no need for future assignment
    contentHeight: img.height
    // ...
}
于 2019-01-14T16:37:30.893 回答