2011-01-20 10 views
1

Qt4では、ペイントイベント以外のウィンドウで描画することはできません。私はラバーバンドライン(特定の独自のインターフェイス用の一般的な描画コード、私は特定のUIで実装する)を描画するためにできることを期待する多くのコードがあります。私はpixmapメソッドについて読んだことがありますが、それは多くの作業であり、実際には私が望むものではないと思います。Qt Painter outside paintEvent - 不可能 - 回避策?

とにかく私がやりたいことができる回避策がありますか?画面上にXORバンドを描くだけでいいです。

WA_PaintOutsidePaintEventフラグを試しました。それからWindows上で動作しないというビットを見た。

答えて

1

問題のウィンドウのHwndにアクセスできる場合は、そのサーフェスにペイントすることができます。そうでなければ、わからない。ピックスマップの方法により、あなたがこのような何かを意味している場合、私はそれが悪い解決策だとは思わない:

m_composed_image = QImage(size, QImage::Format_ARGB32); 
m_composed_image.setDotsPerMeterX(dpm); 
m_composed_image.setDotsPerMeterY(dpm); 
m_composed_image.fill(Qt::transparent); 

//paint all image data onto new image 
QPainter painter(&m_composed_image); 
painter.drawImage(QPoint(0, 0), m_alignment_image); 
+0

さて、pixmapメソッドは、ピックスマップに描画し、それをペイントのウィンドウにコピーすることです。 HWNDのアイデアは、私が考えていたものですが、回避したいと考えていました。できるだけ早く分解して、もっと深く包み込む方法を見つけようとします。それを「正しい」方法で行い、ソフト/ハードリフレッシュを区別する何らかの方法を思いついてください。 –

1

だけQPixmapにペイント、そしてpaintEventで実際のウィジェットにコピーします。これが唯一の標準的な方法です。あなたはそれを回避しようとすべきではありません。

3

最近のコンポジットデスクトップでは、アルファブレンディングやその他のエフェクトを正しいバックバッファに順番に適用できるように、ウィンドウマネージャはウィンドウペイントを同期させる必要があります。ティアフリーウィンドウのアニメーションを可能にする。

このプロセスのアウトオブバンドのペインティングを呼び出すことは、基本的なプラットフォームでレガシーな理由のためにサポートされていますが、このプロセスを妨害し、いくつかの非常に最適でないコードパスを実行させます。

基本的に、ウィンドウでペイントするときは:無効にする関数を呼び出してペイントをすぐにスケジュールし、ペイントイベント中にペイントします。

+0

良い情報、ありがとう。 –

0

答えの1つに言及したように、ピックスマップバッファを作成するのが最善の方法です。塗装作業はバッファーで行われ、作業が完了したらrepaint()が予定されています。そして、paintEvent()関数は、ピクセルバッファをコピーしてウィジェットをペイントするだけです。

ユーザーが値を入力してボタンを押すと、ウィジェット領域に円を描こうとしていました。これが私の解決策でした。 drawCircle()スロットをclicked()信号に接続します。

class PaintHelper : public QWidget 
{ 
    Q_OBJECT 
private: 
    QPixmap *buffer; 

public: 
    explicit PaintHelper(QWidget *parent = 0) : QWidget(parent) 
    { 
     buffer=new QPixmap(350,250);// this is the fixe width of this widget so 
     buffer->fill(Qt::cyan); 
    } 

signals: 
public slots: 
    void drawCircle(int cx, int cy, int r){ 


     QPainter painter(buffer); 
     painter.setBrush(QBrush(QColor(0,0,255))); 

     // A part of mid-point algorithm to draw 1/8 pacrt of circle 
     int x1=0,y1=r; 
     int p=1-r; 
     for(int i=0;y1>=x1;i++){ 
      painter.drawPoint(x1+cx,y1+cy); 
      x1++; 
      if(p>0){ 
       p+=3+x1; 
      } 
      else{ 
       y1--; 
       p+=2*x1-2*y1; 
       p++; 
      } 
     } 
     this->repaint(); 
    } 



    // QWidget interface 
protected: 
    void paintEvent(QPaintEvent *event) 
    { 
     QPainter painter(this); 
     painter.drawPixmap(0,0,*buffer); 
    } 
};