Загружаемое содержимое холста qml не изменяется и не может меняться
У меня есть Flickable
с ребенком Canvas
а также Image
, Я загружаю изображение в source
из Image
по нажатию кнопки. Это все работает. Проблема в том, что мерцание не обновляет его размеры до размера изображения, так что все изображение "мерцает", и я могу прокручивать его (оно больше, чем видимое окно). Тем не менее, это обновляет, если я изменяю размер окна, и я могу затем пролистать изображение.
Я думаю, это потому, что окно перерисовывается и qml перечитывает img.width
а также img.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
}
}
1 ответ
Похоже, вы пытаетесь получить доступ к width
/height
изображения до его загрузки.
Вы должны переместить свой Flickable contentWidth
/contentHeight
назначение под 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
// ...
}