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

3

我的代码如下。

名称 - 作为文本字段,

照片 - 作为二进制大对象数据

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: ???
        }
    }
}

怎样在QML(Qt)中显示从SQLite BLOB数据读取的图像?

1
我猜你需要 QQuickImageProvider - folibis
1个回答

7
你有三个选项:
  1. 让模型分配一些ID,并将其与 QQuickImageProvider 一起使用
  2. 让模型分配一个 QImage,并编写一个可以显示它的自定义项
  3. 让模型将图像数据作为数据 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<QImageItem>("SomeModuleName", 1, 0, "SomeTypeName") 进行注册,在 QML 中导入 import SomeModuleName 1.0 并使用 SomeTypeName 替代 Image,通过将模型绑定到项的 image 属性返回的 QImage 来使用。


我想看一些相关的例子。 - Cat Vasey
选择哪个选项? - Kevin Krammer
对于每个比较效果的选项 - Cat Vasey
我在QQuickImageProvider上找到了一些例子,但其他方面没有找到。 - Cat Vasey
第一种选择是一个完整的维基百科页面,我相信还有很多其他页面可以提供相关信息。对于第二个选项,最简单的方法是使用派生自QQuickPaintedItem类的类,并具有一个QImage属性。 - Kevin Krammer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接