如何将 QPixmap 从 C++ 模型传递到 QML?

Posted

技术标签:

【中文标题】如何将 QPixmap 从 C++ 模型传递到 QML?【英文标题】:How to pass QPixmap from a C++ model to QML? 【发布时间】:2021-12-19 11:50:01 【问题描述】:

我使用 QAbstractItemModel 为键盘启动器上下文中的各种事物提供图标。

这些是要求:

前端是抽象的,因此该模型应该适用于小部件以及 QML 视图。这是由于装饰角色无法退回Qicons(AFAIK)的限制。 Li> 后端应该与平台无关。在 Linux 上,我使用 QMimeDatabase::mimeTypeForFile > QMimeType::iconName > QIcon::fromTheme。在 macOS Qt 上不提供此类功能,因此我计划使用返回 NSImageicon(for:),我必须将其绘制到 QPixmap 中。

没有图标,没有路径。只剩下QPixmap了,对吧?这是要走的路吗?我可以在 QML 中显示来自 C++ 模型的 QPixmap 吗?或者我应该缓存磁盘上的图标并通过模型中的路径吗?

另一个要求是它应该相当快,因为​​它是一个键盘启动器,结果应该立即显示出来。

【问题讨论】:

为什么你认为模型不能返回QIcon? AFAIK,这不是真的。 我可以将 QPixmap 从 C++ 模型传递到 QML 吗? 看看Qt::DecorationRole:要以图标形式呈现为装饰的数据. (QColor、QIcon 或 QPixmap) 我正在为你做一个例子。拜托,待命。 当然模型可以返回任何 QVariant,但是 QML 视图不能使用 QIcon afaik。 @scopchanov 编辑了这个问题。抱歉不够清楚。 @ManuelSchneid3r,我快到了。 ;) 请稍候。 【参考方案1】:

解决方案

我必须承认,它并不像我希望的那样简单,但无论如何:

从 C++ 后端提供模型,例如:

class Backend : public QObject

    ...
    QStandardItemModel *model() const  return m_model; 
    ...

private:
    QStandardItemModel *m_model;
;

使用QQuickImageProvider 子类来获取给定模型索引的装饰角色的像素图,如下所示:

QPixmap requestPixmap(const QString &id, QSize *, const QSize &) override 
    const QModelIndex &index(m_model->index(id.toInt(), 0));
    const QIcon &icon(m_model->data(index, Qt::DecorationRole).value<QIcon>());

    return icon.pixmap(QSize(16, 16));

main.cpp你需要以下代码:

Backend backend;

engine.rootContext()->setContextProperty("backend", &backend);
engine.addImageProvider(QLatin1String("icons"), new PixmapBuilder(backend.model()));

qmlRegisterUncreatableType<QStandardItemModel>("QStandardItemModel", 1, 0, "QStandardItemModel", "The model should be created in C++");

最后像这样在 QML 中设置Image 组件的源代码:

Image 
    id: name
    source: "image://icons/" + index

示例

在 GitHub 上,您可以找到 an example 我为您编写的代码,用于演示建议的解决方案。

结果

该示例产生以下结果:

【讨论】:

以上是关于如何将 QPixmap 从 C++ 模型传递到 QML?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 C++ 设置 ListView 模型?

如何将组件指针从 QML 传递到 C++?

如何使用 DLLImport 将字符串从 C# 传递到 C++(以及从 C++ 到 C#)?

如何将二维数组从 C# 传递到 C++?

如何使用 Emscripten 将对象从 Javascript 传递到 C++

SWIG:如何将复数向量从 C++ 传递到 python