我正在编写一个信息屏幕程序。我创建了一个全屏小部件并在其上绘制内容。
为了延长 TFT 显示设备的生命周期,我想实现像素移位功能。换句话说,每X分钟,我将屏幕向左/右/上/下移动Y像素。
我的方法如下:
- 我使用两层(两个 QWidget)。
- 我在顶层绘制内容。
- 当执行像素移动时,我只是将顶层移动到指定的偏移量。
- 然后在底层填充背景颜色。
但是,我发现了一个问题:
如果我将顶层向上移动 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);