Qt画的内容迷失了

时间:2010-01-15 16:57:04

标签: qt d paint erase

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

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

我的方法如下:

  1. 我使用两层(两个QWidget)。
  2. 我在顶层绘制内容。
  3. 当执行像素移位时,我只是将顶层移动指定的偏移量。
  4. 然后将背景颜色填充到底层。
  5. 然而,我发现了一个问题:

    如果我将顶层向上移动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);
    

2 个答案:

答案 0 :(得分:2)

查看代码,我的第一个猜测是你的地区可能是错的。尝试每次重新绘制整个小部件,看看是否能解决丢失的10像素问题。如果确实如此,那么试着弄清楚为什么你的地区没有覆盖新暴露的部分。

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

答案 1 :(得分:1)

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