Как известно большинству людей, знакомых с QML, в QML нет встроенной функции обновления. Image
,
Я хотел бы создать новый тип QML, скажем, RefreshableImage
чтобы облегчить эту проблему, не прибегая к смене источника, что, на мой взгляд, является уродливым хаком, поскольку оно сливается со всеми слоями отношения Модель-Вид, и такое поведение переключения неестественно. Кроме того, установка другого source
на Image
нарушает любую привязку, которая могла быть установлена (что на самом деле является ядром проблемы: я хочу обновляемое изображение, которое поддерживает свою привязку и изолировано от QML). Я понимаю, что мне нужно вызвать сигнал для обновления изображения, это нормально.
У меня проблемы с поиском документации по расширению собственного Qt Image
так что я могу заставить его перезагрузить свой источник. Я хотел бы избежать написания полного компонента, который в основном плохо дублирует Image
добавить одну функцию. Есть ли способ расширить встроенный компонент, как я имею в виду?
Незначительные примечания:
source
UUID базового объекта изображения, который используется QQuickImageProvider
чтобы получить актуальный QImage
, Поэтому я не хочу менять это при обновлении изображения.Вы могли бы создать 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
имущество
Грубый скелет для непосредственного использования 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()
сигнал, когда актуальный контент доступен.