2

私は情報画面プログラムを書いています。フルスクリーン ウィジェットを作成し、その上にコンテンツを描画します。

TFT ディスプレイ デバイスの寿命を延ばすために、ピクセル シフト機能を実装したいと考えています。つまり、 X分ごとに、 Yピクセル分、画面を左/右/上/下にシフトします。

私のアプローチは次のとおりです。

  1. 2 つのレイヤー (2 つの QWidget) を使用します。
  2. 一番上のレイヤーにコンテンツをペイントします。
  3. ピクセルシフトが実行されると、指定されたオフセットの最上層を移動するだけです。
  4. そして、一番下のレイヤーに背景色を塗りつぶします。

ただし、問題が見つかりました:

最上層を 10 ピクセル上に移動すると、10 ピクセルのコンテンツが画面からはみ出してしまいます。しかし、このレイヤーを10ピクセル下に移動すると. 10 ピクセルのコンテンツは更新されず、なくなりました。

これらの 10 ピクセルのコンテンツを保持するにはどうすればよいですか? この問題を解決する魔法のウィジェット フラグはありますか?

更新 1: コードは言語 D で書かれていますが、理解しやすいです。

class Canvas: QWidget
{
    private QPixmap content;

    this(QWidget parent)
    {
        super(parent);
        setAttribute(Qt.WA_OpaquePaintEvent, true);
    }

    public void requestForPaint(QPixmap content, QRegion region)
    {
        this.content = content;
        update(region);
    }

    protected override void paintEvent(QPaintEvent event)
    {
        if (this.content !is null)
        {
            QPainter painter = new QPainter(this);
            painter.setClipping(event.region);
            painter.fillRect(event.region.boundingRect, new QColor(0, 0, 0));
            painter.drawPixmap(event.region.rect, this.content);
            this.content = null;
            painter.setClipping(false);
        }
    }
}

class Screen: QWidget
{
    private Canvas canvas;

    this()
    {
        super(); // Top-Level widget
        setAutoFillBackground(True);
        this.canvas = new Canvas(this);
        showFullScreen();
    }

    public void requestForPaint(QPixmap content, QRegion region)
    {
        this.canvas.requestForPaint(content, region);
    }

    private updateBackgroundColor(QColor backgroundColor)
    {
        QPalette newPalette = palette();
        newPalette.setColor(backgroundRole(), backgroundColor);
        setPalette(newPalette);
    }

    public shiftPixels(int dx, int dy)
    {
        this.canvas.move(dx, dy);
        updateBackgroundColor(new QColor(0, 0, 0)); // Just a demo background color
    }
}

Screen screen = new Screen;
screen.requestForPaint(some_content, some_region);
screen.shiftPixels(0, -10);
screen.shiftPixels(0, 10);
4

2 に答える 2

2

コードを見て、私の最初の推測では、地域が間違っている可能性があります。毎回ウィジェット全体を再描画してみて、10 ピクセルの欠落の問題が解決するかどうかを確認してください。もしそうなら、あなたの地域が新しく露出した部分をカバーしていない理由を調べてみてください.

これらの線に沿った1つの可能性:あなたのメソッドで、リージョンで何もせずScreen::requestForPaintに直接呼び出すことに気付きました。Canvas::requestForPaintQt では、そのようなものの座標はローカルであると見なされることが多いため、キャンバス ウィジェットの現在の位置を考慮しないと、正しくない領域が得られる可能性があります。

于 2010-01-17T15:34:46.353 に答える
1

ウィジェットの位置を直接設定しないのはなぜですか...? 別のオプションとして、QPainter::translate(-1,-1) などを使用することもできます。

于 2010-01-17T15:46:13.643 に答える