2017-12-04 15 views
0

アプリケーションウィンドウのヘッダーが透明で、ぼやけた画面の内容が表示されるWindows 7テーマを再作成する必要があります。私の考えは、画面の内容をキャプチャし、ヘッダーにぼかして表示することでした。そのため私はQQuickPaintedItemを拡張しました。ここでQPixmapペイントパフォーマンスの問題

はヘッダーです:名前が示唆するよう

class DesktopImage : public QQuickPaintedItem 
{ 
    Q_OBJECT 

    Q_PROPERTY(int desktopX READ desktopX WRITE setDesktopX NOTIFY desktopXChanged) 
    Q_PROPERTY(int desktopY READ desktopY WRITE setDesktopY NOTIFY desktopYChanged) 

public: 
    explicit DesktopImage(QQuickItem *parent = nullptr); 

    void paint(QPainter *painter) override; 

    int desktopX() const; 
    void setDesktopX(int desktopX); 

    int desktopY() const; 
    void setDesktopY(int desktopY); 

signals: 
    void desktopXChanged(); 
    void desktopYChanged(); 

private: 
    void grabScreensContent(); 

private: 
    QPixmap mScreensContent; 
    int mDesktopX; 
    int mDesktopY; 

}; 

grabScreensContent()メソッドを実行します。あなたはdesktopX(desktopY)を見ることができるように

DesktopContent { 
    id: desktop 
    desktopX: window.x 
    desktopY: window.y 
    width: parent.width 
    height: parent.height  
} 

プロパティがバインドされています

QML側
void DesktopImage::paint(QPainter *painter) 
{ 
    QRectF target(0, 0, width(), height()); 
    QRectF source(mDesktopX, mDesktopY, width(), height()); 
    painter->drawPixmap(target, mScreensContent, source); 
} 

次のように、私はタイプを使用します。以下のようにpaint()メソッドが実装されていますwindow x(window y)プロパティを使用して、ユーザがウィンドウを移動するときに、描画する必要があるバックグラウンドの部分が適切にフェッチされるようにします。しかし、図面は予想通りに流動的ではありません。ここでの結果は次のとおりです。

Slow pixmap paint

誰かがパフォーマンスの改善を提案することはできますか?

+0

なぜQQuickItemを使用しないのですか? 'QQuickPaintedItem'はシーングラフにペイントするために2つのステップを使用するので、より速くなるはずです。 – folibis

+0

@folibis私はそれを試してみましょう。ありがとう – mkorunoski

答えて

1

renderTargetFramebufferObjectに設定してください。これは基本的には通常のQMLレンダリングと同じくらい効果的にするはずですが、便利な場合もあるQPainterを使用することができます。

DesktopImage::DesktopImage(QQuickItem *parent) 
{ 
    // this setting is not default 
    this->setRenderTarget(QQuickPaintedItem::FramebufferObject); 
} 

また、画面全体が必要ない場合は、限られた画面領域でのみ動作します。これは、プラットフォーム/実装によっては助けになるかもしれませんが、ターゲットのスコープを常に制限してからソースを配置します。低レベルの絵画は、必ずしも非常にインテリジェントではなく、全領域にわたって多くの変更を期待することができる。ですから、最小ターゲットエリアを指定し、変更するだけです(このケースはそのように機能します)。

void DesktopImage::paint(QPainter *painter) 
{ 
    QRectF target(mDesktopX, mDesktopY, width(), height()); // now limited 
    QRectF source(0, 0, width(), height());     // now within smaller target 
    painter->drawPixmap(target, mScreensContent, source); 
}