【问题标题】:How to show on QML (Qt) from SQLite BLOB data as image?如何将 SQLite BLOB 数据中的 QML (Qt) 显示为图像?
【发布时间】:2017-03-14 11:49:42
【问题描述】:

我的代码如下。

名称 - 作为 TEXT 字段,

照片 - 作为 BLOB 数据

class SqlQueryModel: public QSqlQueryModel
{
    Q_OBJECT
    QHash<int,QByteArray> *hash;
public:
    explicit SqlQueryModel(QObject * parent) : QSqlQueryModel(parent)
    {
        hash = new QHash<int,QByteArray>;
        hash->insert(Qt::UserRole,      QByteArray("Name"));
        hash->insert(Qt::UserRole + 1,  QByteArray("Photo"));
    }
    inline RoleNameHash roleNames() const { return *hash; }
};

选择数据

view = new QQuickView();
QSqlQueryModel *someSqlModel = new SqlQueryModel(this);
someSqlModel->setQuery("SELECT Name, Photo FROM some_table");
QQmlContext *context = view->rootContext();
context->setContextProperty("someSqlModel", someSqlModel);
view->setSource(QUrl("qrc:///MainView.qml"));
view->show();

QML 中的绑定

ListView {
    id: someListView
    model: SqlContactModel {}
    delegate: ItemDelegate {
        text: Name
        Image {
            id: Photo
            source: ???
        }
    }
}

如何将 SQLite BLOB 数据中的 QML (Qt) 显示为图像?

【问题讨论】:

标签: qt sqlite qml blob


【解决方案1】:

您有三个选择:

  1. 让模型分发一些 ID 并将其与 QQuickImageProvider 一起使用
  2. 让模型分发一个QImage 并编写一个可以显示它的自定义项目
  3. 让模型以data URI的形式分发图像数据

对于 (2),最简单的解决方案是 QQuickPaintedItem 派生类,类似这样

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

public:
    explicit QImageItem(QQuickItem *parent = Q_NULLPTR) : QQuickPaintedItem(parent) {}

    QImage image() const { return m_image; }
    void setImage(const QImage &image);

    void paint(QPainter *painter) Q_DECL_OVERRIDE;

private:
    QImage m_image;
};

void QImageItem::setImage(const QImage &image)
{
    m_image = image;
    emit imageChanged();
    update();

    setImplicitWidth(m_image.width());
    setImplicitHeight(m_image.height());
}

void QImageItem::paint(QPainter *painter)
{
    if (m_image.isNull()) return;

    painter.drawImage(m_image.scaled(width(), height()));
}

像往常一样使用qmlRegisterType&lt;QImageItem&gt;("SomeModuleName", 1, 0, "SomeTypeName") 和QML 中的import SomeModuleName 1.0 注册并使用SomeTypeName 代替Image,模型返回的QImage 绑定到项目的image 属性

【讨论】:

  • 我会看到一些例子。
  • 哪个选项?
  • 对每个选项比较效果
  • 我在 QQuickImageProvider 上找到了一些示例,但其他人没有。
  • 最后一个选项有一个完整的维基百科页面,我相信上面还有很多其他页面。对于第二个选项,最简单的方法是使用具有 QImage 属性的 QQuickPaintedItem 派生类
猜你喜欢
  • 2017-08-19
  • 2018-01-28
  • 2015-11-15
  • 2021-11-16
  • 2018-11-26
  • 1970-01-01
  • 2015-05-28
  • 2017-04-23
相关资源
最近更新 更多