我正在写一个信息屏幕程序。我创建了一个全屏小部件并在其上绘制内容。
为了延长TFT显示器件的生命周期,我想实现像素移位功能。换句话说,在每个 X 分钟内,我将屏幕向左/右/上/下移动 Y 像素。
我的方法如下:
然而,我发现了一个问题:
如果我将顶层向上移动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);
答案 0 :(得分:2)
查看代码,我的第一个猜测是你的地区可能是错的。尝试每次重新绘制整个小部件,看看是否能解决丢失的10像素问题。如果确实如此,那么试着弄清楚为什么你的地区没有覆盖新暴露的部分。
沿着这些方向的一种可能性:我在你的Screen::requestForPaint
方法中注意到你直接调用Canvas::requestForPaint
而没有对该区域做任何事情。在Qt中,任何类似的坐标通常都被认为是本地的,所以如果你不考虑画布小部件的当前位置,你可能会得到一个不正确的区域。
答案 1 :(得分:1)
为什么不直接设置小部件的位置......?另一个选择可能是使用QPainter :: translate(-1,-1)或类似的东西。