Загружаемое содержимое холста qml не изменяется и не может меняться - PullRequest
0 голосов
/ 13 января 2019

У меня есть 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 Ответ

0 голосов
/ 14 января 2019

Похоже, вы пытаетесь получить доступ к 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
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...