gpt4 book ai didi

c++ - QML 和 C++ 图像互操作性

转载 作者:太空狗 更新时间:2023-10-29 20:03:37 26 4
gpt4 key购买 nike

我查看了文档以及我在 Internet 上可以找到的任何内容,但似乎无法从 C++ 访问 QML 图像。

有没有办法解决这个问题?

最佳答案

在 QtQuick1 中可以这样做,但在 QtQuick2 中删除了该功能。

我提出的解决方案允许在 QML 和 C++ 中使用相同的图像,方法是实现一个 QQuickImageProvider,它基本上与转换为字符串的 QPixmap * 一起使用然后回到指针类型(这听起来确实有点不安全,但已证明工作得很好)。

class Pixmap : public QObject {
Q_OBJECT
Q_PROPERTY(QString data READ data NOTIFY dataChanged)
public:
Pixmap(QObject * p = 0) : QObject(p), pix(0) {}
~Pixmap() { if (pix) delete pix; }

QString data() {
if (pix) return "image://pixmap/" + QString::number((qulonglong)pix);
else return QString();
}

public slots:
void load(QString url) {
QPixmap * old = 0;
if (pix) old = pix;
pix = new QPixmap(url);
emit dataChanged();
if (old) delete old;
}

void clear() {
if (pix) delete pix;
pix = 0;
emit dataChanged();
}

signals:
void dataChanged();

private:
QPixmap * pix;
};

Pixmap 元素的实现非常简单,尽管最初有点受限,因为新的 pixmap 恰好分配在与 data 完全相同的内存地址> 字符串对于不同的图像是相同的,导致 QML Image 组件不更新,但解决方案很简单,只需在分配新的 pixmap 后删除旧的 pixmap。这是实际的图像提供者:

class PixmapProvider : public QQuickImageProvider {
public:
PixmapProvider() : QQuickImageProvider(QQuickImageProvider::Pixmap) {}
QPixmap requestPixmap(const QString &id, QSize *size, const QSize &requestedSize) {
qulonglong d = id.toULongLong();
if (d) {
QPixmap * p = reinterpret_cast<QPixmap *>(d);
return *p;
} else {
return QPixmap();
}
}
};

注册:

//in main()
engine.addImageProvider("pixmap", new PixmapProvider);
qmlRegisterType<Pixmap>("Test", 1, 0, "Pixmap");

这就是您在 QML 中使用它的方式:

Pixmap {
id: pix
}

Image {
source: pix.data
}

// and then pix.load(path)

另请注意,在我的例子中,没有需要在 QML 中更新的像素图的实际修改。如果在 C++ 中更改图像,此解决方案将不会自动更新 QML 中的图像,因为内存中的地址将保持不变。但是解决这个问题的方法同样简单 - 实现一个分配 new QPixmap(oldPixmap)update() 方法 - 它会使用相同的内部数据,但给你一个具有新内存地址的新访问器,这将触发 QML 图像更新更改。这意味着提供的访问像素图的方法将通过 Pixmap 类,而不是直接来自 QPixmap * 因为您将需要 Pixmap 类触发 data 更改,所以只需为 pix 添加一个访问器,以防万一你做复杂或线程化的事情,你可能想使用 QImage 而不是并添加一个互斥体,这样底层数据在 QML 中不会被更改,而在 C++ 或其他方式中被更改。

关于c++ - QML 和 C++ 图像互操作性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27429371/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com