2

我正在编写一个信息屏幕程序。我创建了一个全屏小部件并在其上绘制内容。

为了延长 TFT 显示设备的生命周期,我想实现像素移位功能。换句话说,每X分钟,我将屏幕向左/右/上/下移动Y像素。

我的方法如下:

  1. 我使用两层(两个 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 像素的问题。如果是这样,请尝试找出您所在区域未覆盖新暴露部分的原因。

沿着这些思路的一种可能性:我注意到在你的Screen::requestForPaint方法中你直接调用了Canvas::requestForPaint而不对该区域做任何事情。在 Qt 中,类似的坐标通常被假定为本地坐标,因此如果您不考虑画布小部件的当前位置,您可能会得到一个不正确的区域。

于 2010-01-17T15:34:46.353 回答
1

为什么不直接设置小部件的位置...?另一个选项可能是使用 QPainter::translate(-1,-1) 或类似的东西。

于 2010-01-17T15:46:13.643 回答