설명서를 보았지만 인터넷에서 찾을 수있는 모든 내용을 살펴 봤지만 C++에서 QML 이미지에 액세스 할 수없는 것처럼 보입니다.QML 및 C++ 이미지 상호 운용성
해결 방법이 있습니까?
설명서를 보았지만 인터넷에서 찾을 수있는 모든 내용을 살펴 봤지만 C++에서 QML 이미지에 액세스 할 수없는 것처럼 보입니다.QML 및 C++ 이미지 상호 운용성
해결 방법이 있습니까?
QtQuick1에서는 가능했지만 QtQuick2에서는 기능이 제거되었습니다.
내 솔루션은 QPixmap *
과 기본적으로 작동하는 QQuickImageProvider
을 구현하여 QML 및 C++에서 동일한 이미지를 가질 수 있으며이 이미지는 문자열로 변환 된 다음 포인터 유형으로 다시 변환됩니다. 그러나 꽤 잘 작동하는 것으로 입증되었습니다). 초기 새로운 픽스맵은 data
문자열이 서로 다른 이미지의 동일 정확히 동일한 메모리 주소에 할당 할 일이 있기 때문에, 조금 제한되어 있지만
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
요소의 구현은 원인, 매우 간단합니다 QML 이미지 구성 요소는 업데이트되지 않지만 새로운 픽스맵이 할당 된 후에 만 이전 픽스맵을 삭제하는 것처럼 간단합니다. 당신은 QML에서 사용하는 방법
//in main()
engine.addImageProvider("pixmap", new PixmapProvider);
qmlRegisterType<Pixmap>("Test", 1, 0, "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();
}
}
};
등록 : 여기에 실제 이미지 제공 업체입니다
Pixmap {
id: pix
}
Image {
source: pix.data
}
// and then pix.load(path)
또한 내 경우 실제 없었다 참고 QML로 업데이트해야하는 픽스맵 수정. 이 솔루션은 메모리의 주소가 동일하게 유지되므로 C++에서 이미지를 변경하면 이미지를 QML로 자동 업데이트하지 않습니다. 그러나 이것에 대한 해결책은 똑같습니다. 즉, new QPixmap(oldPixmap)
을 할당하는 update()
메서드를 구현합니다. 동일한 내부 데이터를 사용하지만 새로운 메모리 주소로 새 접근자를 제공하므로 QML 이미지가 변경 사항을 업데이트하도록 트리거합니다 . 즉, Pixmap
클래스가 data
변경을 트리거해야하기 때문에 픽스맵에 액세스하기 위해 제공된 메소드는 QPixmap *
에서 직접적으로 액세스하지 않고 Pixmap
클래스를 통해 전달되므로 pix
에 접근자를 추가하면 복잡하거나 스레드 물건을 사용하는 대신 QImage
을 사용하고 뮤텍스를 추가하여 C++ 또는 그 반대로 변경되는 동안 기본 데이터가 QML에서 변경되지 않도록 할 수 있습니다.