2016-12-15 12 views
2

QML에 익숙한 대부분의 사람들은 QML Image에 내장 된 "새로 고침"기능이 없음을 알고 있습니다.업데이트 기능이있는 QML 이미지 형식 확장

새로운 QML 유형, 예를 들어 RefreshableImage을 작성하여 모델 - 뷰 관계와이 전환의 모든 레이어로 피를 흘리기 때문에 소스 코드를 변경하지 않고이 문제를 해결할 수 있습니다. 행동이 부자연 스럽다. 또한 다른 sourceImage에 설정하면 설정되었을 수있는 모든 바인딩이 끊어집니다 (실제로 문제의 핵심 : 바인딩을 유지하고 QML과 격리되는 업데이트 가능한 이미지를 원합니다). 이미지를 실제로 새로 고침하려면 신호를 호출해야 할 것입니다. 괜찮습니다.

Qt 자신의 Image 확장 방법에 관한 문서를 찾는 데 어려움을 겪고 있으므로 소스를 다시로드 할 수 있습니다. 하나의 기능을 추가하기 위해 주로 Image을 복제하는 완전한 구성 요소를 작성하는 것을 피하고 싶습니다. 내가 염두에두고있는 것처럼 기본 제공 구성 요소를 확장 할 수있는 방법이 있습니까?

마이너 노트 :

  • 인해 외부 상황에, 나는 Qt는 5.5로 제한입니다.
  • QQuickImageProvider이 사용하는 기본 이미지 객체의 UUID를 으로 사용합니다. 따라서 이미지를 업데이트 할 때이를 변경하고 싶지 않습니다.
+0

왜 '이미지'를 '소스'같은 것으로 업데이트해야합니까? 그게 같은 이미지가 아닌가요? – folibis

+0

@folibis 기술적으로 예,하지만 기본 데이터가 변경되었습니다. QML ImageProviders를 사용하여 데이터 구조에서 QML을 QML에 제공합니다. 우리가 사용하는 id는 우리 시스템의 이미지의 uuid입니다. 따라서 uuid에서 실제 객체를 가져올 수 있습니다. 우리는 단순화를 위해이 uuid를 재사용하고 있습니다. – rubenvb

+0

아,이 질문에 질문을 지정해야합니다. 나는 그것이 중요하다고 생각한다. – folibis

답변

3

너에게서 추한 추한 소스를 숨기는 RefreshableImage 유형을 만들 수 있습니다.

import QtQuick 2.0 

Image { 
    id: root 
    property string refreshableSource 
    source: refreshableSource 
    function refresh() { 
     source = ""; 
     source = Qt.binding(function() { return refreshableSource }); 
    } 
} 

당신은 그런 식으로 그것을 사용해야합니다 : :

소스에 대한 새로운 속성을 도입하여 그 일을하는 간단한 방법이있다 RefreshableImage { refreshableSource: "image.jpg" }.

source을 속성으로 계속 사용하려는 경우 일부 별칭 헛소리와 함께 사용할 수 있습니다. 구성 요소가 완전히 초기화 된 후에 만 ​​별칭이 활성화되므로 source 속성을 Image으로 덮어 쓸 수 있지만 여전히 기본 구성 요소에 액세스 할 수 있습니다.

import QtQuick 2.0 

Image { 
    id: root 
    property alias actualUnderlyingSource: root.source //this refers to Image.source and not the newly created source alias 
    property alias source: root.refreshableSource 
    property string refreshableSource 
    actualUnderlyingSource: refreshableSource 
    function refresh() { 
     actualUnderlyingSource = ""; 
     actualUnderlyingSource = Qt.binding(function() { return refreshableSource }); 
    } 
} 

그런 다음, 사실이 의지가 refreshableSource 특성을 수정할 수 있도록 RefreshableImage { source: "image.jpg" }처럼 사용할 수

+0

방법은 실제 이미지 개체에 연결하는 기본 C++ 추가 할 수 있습니다? QML Image를 C++로 확장 할 수 있습니까? 나는'ImageRefresher' C++/QML 구성 요소/객체의 합성이 이것을 가능하게 할 것이라고 생각합니다. 문제의 uuid에 첨부 된 객체를 듣거나 관찰하고 싶습니다. 감사! – rubenvb

0

직접 등록 사용자 정의 항목

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

public: 
    void paint(QPainter *painer); 
    void setImage(const QImage &image); 
}; 

void DirectImage::paint(QPainter *painter) 
{ 
    painter->drawImage(m_image.scaled(width(), height()): 
} 

void DirectImage::setImage(const QImage &image) 
{ 
    m_image = image; 
    emit imageChanged(); 
    setImplicitWidth(image.width()); 
    setImplicitHeight(image.height()); 
    update(); 
} 

와 모델에서 QImage를 사용하는 거친 골격 via

qmlRegisterType<DirectImage>("MyElements", 1, 0, "RefreshableImage"); 

via

import MyElements 1.0 

// ... 

RefreshableImage { 
    image: model.image 
} 

모델은 이미지의 역할을 요청하면 QImage이 이미지의 역할을 할 때마다 이미지 변경 사항으로 dataChanged() 신호를 방출 반환합니다.

필요에 따라 이미지를 생성해야하는 경우 모델은 먼저 빈 이미지 또는 자리 표시 자 이미지를 반환하고 실제 콘텐츠를 사용할 수있을 때 dataChanged() 신호를 내 보냅니다.