2010-01-15 130 views
2

我正在寫一個信息屏幕程序。我創建了一個全屏小部件並在其上繪製內容。Qt畫內容丟失

爲了延長TFT顯示設備的生命週期,我想實現像素移位功能。換言之,在每個X分鐘內,我將屏幕左移/右移/上/下移Y像素。

我的方法如下:

  1. 我使用兩個層(2 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); 
+0

你能發表一些重現問題的示例代碼嗎?我從來沒有見過一個小部件無法重繪時,它變得可見。 –

回答

2

看代碼,我的第一個猜測是,您所在的地區可能是錯的。嘗試每次都重新繪製整個小部件,並查看是否可以解決丟失的10像素問題。如果確實如此,那就試着弄清楚爲什麼你的地區不覆蓋新暴露的部分。

沿着這些方向的一種可能性:我注意到在你的Screen::requestForPaint方法中,你直接調用Canvas::requestForPaint而不對該地區做任何事情。在Qt中,像這樣的東西的座標通常被認爲是本地的,所以如果你不考慮canvas部件的當前位置,你可能會得到一個不正確的區域。

+0

我的應用程序全屏運行,沒有鼠標沒有鍵盤連接。畫布不會正常弄髒。所以,我只需要確保新上色的區域看起來不錯。 但是,如果畫布變髒,我不可能重新繪製整個畫布,因爲我沒有保存關於整個畫面應如何繪製的信息。 (當然有一些方法可以保存屏幕內容) 我只是想知道,當我將它移出屏幕然後將其移回時,QWidget的內容會丟失。我正在尋找解決方案。 – stanleyxu2005

+0

順便說一句:原因,爲什麼我不畫每一次的整個屏幕,是我在屏幕上有一些字幕文本。如果我在20ms內重新繪製所有內容,則CPU使用率會很高。你的意思是 – stanleyxu2005

1

爲什麼不直接設置小部件的位置......?另一種選擇可能是使用QPainter :: translate(-1,-1)或類似的東西。

+0

,我應該只用一個畫布而不是兩個。我應該用QPainter :: translate(dx,dy)打印內容?但是這並不能解決我的問題。 我可能會在左上角畫一些內容。 30秒後,我在右下角畫了一些其他內容。休息區保持不變。再過30秒後,我希望整個畫布移動。在這一刻,最簡單的方法就是移動小部件,不是嗎? – stanleyxu2005