Я пишу инфо-экранную программу. Я создал полноэкранный виджет и нарисовал на нем содержимое.Покрашенный контент Qt пропадает
Чтобы продлить жизненный цикл устройства TFT-дисплея, я хочу реализовать функцию смещения пикселей. Другими словами, в каждом X минут я сдвигаю экран влево/вправо/вверх/вниз для Y пикселей.
Мой подход заключается в следующем:
- Я использую два слоя (две QWidget).
- Я рисую содержимое на верхнем слое.
- Когда выполняется смещение пикселей, я просто перемещаю верхний слой для указанного смещения.
- И затем заполните цвет фона нижнему слою.
Тем не менее, я нашел проблему:
Если я двигаться вверх верхний слой на 10 пикселей, 10-пиксельное содержание выходит из экрана. Но когда я перемещаю этот слой на 10 пикселей. 10-пиксельный контент не будет обновлен, он исчезнет.
Как сохранить 10-пиксельный контент? Есть ли волшебный флаг виджета для решения этой проблемы?
UPDATE 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);
Можете ли вы опубликовать несколько примеров кода, который воспроизводит проблему? Я никогда не видел, чтобы виджет не перерисовывался, когда он становился видимым. –