Загружаемое содержимое холста 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
    // ...
}
Другие вопросы по тегам