Привязать QIcon, предоставленный классом, производным от QAbstractListModel, к изображению QML

Я пытаюсь привязать QIcon, предоставленный классом, производным от QAbstractListModel, к изображению QML следующим образом:

Component {
id: myDelegate
//...
Column {
anchors.verticalCenter: parent.verticalCenter
spacing: 5

Image {
source: model.DecorationRole
}

Text {
text: model.DisplayRole
//...
}

Но это приводит к этой ошибке:

Невозможно назначить QIcon для QUrl

Как это сделать правильно?

1

Решение

Вы не можете назначить QIcon как источник QML Image,

Что вам нужно сделать, это выбрать собственный формат URL для ваших значков, например,

images://myicons/<icon_id>

Эта строка является тем, что вы задали в качестве URL для Image.source,

Теперь вы создаете и регистрируете imageprovider, который доставляет значок при отправке запрошенного URL из QML:

  • Создать подкласс QQuickImageProviderнапример, MyIconProvider
  • Переписать функцию requestPixmap это берет id как и аргумент и возвращает данные пикселей

Затем вы регистрируете провайдера изображений в своем main.cpp

MyIconProvider *mip = new MyIconProvider();
engine.addImageProvider("myicons", mip);
2

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

Я разобрался с этим решением. Это работает, но любые предложения или улучшения приветствуются.

ImageProvider.h

class ImageProvider : public QQuickImageProvider
{
public:
explicit ImageProvider(myModel *myModel);
QPixmap requestPixmap(const QString &id, QSize *size, const QSize &requestedSize);

signals:

public slots:

private:
myModel *m_myModel;
};

ImageProvider.cpp

ImageProvider::ImageProvider(myModel *myModel) :
QQuickImageProvider(QQuickImageProvider::Pixmap),
m_myModel(myModel)
{
}

QPixmap ImageProvider::requestPixmap(const QString &id, QSize *size, const QSize &requestedSize)
{
QModelIndex index;
bool foundId = false;

for(int row = 0; row < m_myModel->rowCount(); row++)
{
index = m_myModel->index(row, 0);
QString name = QVariant(m_myModel->data(index, Qt::DisplayRole)).toString();

if(name == id)
{
foundId = true;
break;
}
}

if(!foundId)
return QPixmap();

QIcon icon = m_myModel->data(index, Qt::DecorationRole).value<QIcon>();

QPixmap pixmap = icon.pixmap(128,128);

return pixmap;
}

зарегистрировать imageProvider …

ImageProvider *imageProvider = new ImageProvider(myModel);
view->engine()->addImageProvider(QLatin1String("provider"), imageProvider);

main.qml

Component {
id: myDelegate
//...
Column {
anchors.verticalCenter: parent.verticalCenter
spacing: 5

Image {
source: "image://provider/" + model.DisplayRole
}

Text {
text: model.DisplayRole
//...
}
2

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