2014-12-11 1 views
3

설명서를 보았지만 인터넷에서 찾을 수있는 모든 내용을 살펴 봤지만 C++에서 QML 이미지에 액세스 할 수없는 것처럼 보입니다.QML 및 C++ 이미지 상호 운용성

해결 방법이 있습니까?

답변

8

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에서 변경되지 않도록 할 수 있습니다.