Расширьте тип изображения QML с помощью функции обновления

Как известно большинству людей, знакомых с QML, в QML нет встроенной функции обновления. Image,

Я хотел бы создать новый тип QML, скажем, RefreshableImage чтобы облегчить эту проблему, не прибегая к смене источника, что, на мой взгляд, является уродливым хаком, поскольку оно сливается со всеми слоями отношения Модель-Вид, и такое поведение переключения неестественно. Кроме того, установка другого source на Image нарушает любую привязку, которая могла быть установлена ​​(что на самом деле является ядром проблемы: я хочу обновляемое изображение, которое поддерживает свою привязку и изолировано от QML). Я понимаю, что мне нужно вызвать сигнал для обновления изображения, это нормально.

У меня проблемы с поиском документации по расширению собственного Qt Image так что я могу заставить его перезагрузить свой источник. Я хотел бы избежать написания полного компонента, который в основном плохо дублирует Image добавить одну функцию. Есть ли способ расширить встроенный компонент, как я имею в виду?

Незначительные примечания:

  • из-за внешних обстоятельств я ограничен Qt 5.5.
  • Мы используем как source UUID базового объекта изображения, который используется QQuickImageProvider чтобы получить актуальный QImage, Поэтому я не хочу менять это при обновлении изображения.

2

Решение

Вы могли бы создать RefreshableImage шрифт, скрывающий от вас уродливый источник.

Есть простой способ сделать это, введя новое свойство для источника:

import QtQuick 2.0

Image {
id: root
property string refreshableSource
source: refreshableSource
function refresh() {
source = "";
source = Qt.binding(function() { return refreshableSource });
}
}

Вы должны использовать это так: RefreshableImage { refreshableSource: "image.jpg" },

Если вы хотите все еще использовать source как собственность, вы можете сделать это с некоторыми псевдонимами махинаций. Поскольку псевдонимы активируются только после полной инициализации компонента, вы можете перезаписать source собственностью Image но все же сможете получить доступ к основному.

import QtQuick 2.0

Image {
id: root
property alias actualUnderlyingSource: root.source //this refers to Image.source and not the newly created source alias
property alias source: root.refreshableSource
property string refreshableSource
actualUnderlyingSource: refreshableSource
function refresh() {
actualUnderlyingSource = "";
actualUnderlyingSource = Qt.binding(function() { return refreshableSource });
}
}

Вы могли бы тогда использовать это так RefreshableImage { source: "image.jpg" }это фактически изменит refreshableSource имущество

3

Другие решения

Грубый скелет для непосредственного использования QImage из модели с пользовательским элементом

class DirectImage : public QQuickPaintedItem
{
Q_OBJECT
Q_PROPERTY(QImage image READ image WRITE setImage NOTIFY imageChanged)

public:
void paint(QPainter *painer);
void setImage(const QImage &image);
};

void DirectImage::paint(QPainter *painter)
{
painter->drawImage(m_image.scaled(width(), height()):
}

void DirectImage::setImage(const QImage &image)
{
m_image = image;
emit imageChanged();
setImplicitWidth(image.width());
setImplicitHeight(image.height());
update();
}

Зарегистрирован через

qmlRegisterType<DirectImage>("MyElements", 1, 0, "RefreshableImage");

Использовать через

import MyElements 1.0

// ...

RefreshableImage {
image: model.image
}

Модель просто возвращает QImage когда спрашивается о роли изображения, испускает dataChanged() сигнал с ролью изображения всякий раз, когда изображение изменяется.

Если изображение должно быть сгенерировано по требованию, модель может сначала вернуть пустое изображение или изображение-заполнитель и выдать dataChanged() сигнал, когда актуальный контент доступен.

0

По вопросам рекламы [email protected]