2016-12-15 46 views
2

QMLをよく知っている人は知っているので、QML Imageには「リフレッシュ」機能が組み込まれていません。更新機能付きのQMLイメージタイプを拡張する

新しいQMLタイプ、たとえばRefreshableImageを作成して、ソースを変更せずにこの問題を緩和したいと思います。これは、Model-Viewの関係とこの切り替えのすべてのレイヤーに流出するので、醜いハックです行動は不自然です。さらに、別のsourceImageに設定すると、設定されている可能性のあるバインディングが破損します(本当に問題の中核をなす:バインディングを維持し、QMLと隔離された更新可能なイメージが必要です)。実際に画像をリフレッシュするには信号を呼び出す必要があることを理解しています。

Qt自身のImageを拡張して、ソースをリロードすることができるようにするためのドキュメントを見つけるのが難しいです。私は完全にコンポーネントを書くことを避けたいと思いますが、ほとんどの場合、1つの関数を追加するためにImageを重複して複製します。私の心のように、組み込みコンポーネントを拡張する方法はありますか?

マイナーノート:

  • 外的な状況に、私はQtの5.5に制限さです。
  • 実際にQImageを取得するためにQQuickImageProviderによって使用される、基礎となる画像オブジェクトのUUIDとしてsourceを使用します。したがって、私はイメージを更新するときにこれを変更したくありません。
+0

「イメージ」を同じ 'ソース 'などで更新する必要があるのはなぜですか?それは同じイメージではありませんか? – folibis

+0

@folibisは技術的にはyesですが、基礎となるデータは変更されています。私たちはQML ImageProvidersを使用して、データ構造からQimagesを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に上書きすることはできますが、依然として基になるものにアクセスできます。あなたはその後、

+0

基本的なC++を追加して実際のイメージオブジェクトに接続できますか? QML ImageをC++で拡張することはできますか?私は 'ImageRefresher' C++/QMLコンポーネント/オブジェクトの合成がこれを可能にすると思いますか?問題のウイイドに付いている物体を聞いたり、観察したりしたい。ありがとう! – rubenvb

0

これは実際にrefreshableSourceプロパティを変更しますので、RefreshableImage { source: "image.jpg" }のように直接カスタムアイテム登録

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のを使用するためのラフな骨格を、それを使用することができ

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 }); 
    } 
} 

via

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

via

import MyElements 1.0 

// ... 

RefreshableImage { 
    image: model.image 
} 

モデルは単に画像の役割を求めたとき、QImageを返すたびに画像が変化する画像の役割を持つdataChanged()信号を発します。

イメージは、オンデマンドで生成する必要がある場合は、最初に空のイメージまたはプレースホルダーイメージを返し、実際のコンテンツが利用可能なときにdataChanged()シグナルを送出できます。

関連する問題