2011-08-15 18 views
1

私はそれにいくつかのウィジェットを持つメインウィンドウを持っている、それぞれ独自のグラフィックが必要です。 QPainterを使用して、ボタン、ボタンなどの特定のイベントの後にのみ、形状、線などを描画したいと考えています。特定のイベントの後でQPainterを使用してペイントする方法はありますか?

問題は、私はちょうど任意の関数でQPainterのを作成する場合、それは動作しません、次のとおりです。

QPainter::setPen: Painter not active 

QPainterの方法だけpaintEvent(QPaintEvent *)関数内で呼び出すことができます!これは、次のような問題を提起:

  1. 私は私がペイントしたいすべてのウィジェットのための私のカスタムクラスを派生しなければならないので、私は私のウィジェットを配置するためにDesignerを使用することはできません。これは、多数のウィジェットでイライラすることがあります。

  2. ウィンドウのペイントイベントごとにウィジェットが移動したり、ウィンドウの前にある他のウィンドウを移動したりするようにウィジェットが再描画されます。私はそれらのウィジェットで多くの描画を行います。そのため、これらのウィジェットでは目に見えるほど瞬きがあります。

これを解決する方法はありますか?私は、画像を表示し、特定のボタンが押されたときにのみそれらの画像を再製作することを考え始めました。私はそれが最もエレガントなソリューションだとは思わない...

答えて

1

デザイナーでカスタムウィジェットを使用することができます:Creating Custom Widgets for Qt Designer

Qt Designerのプラグインベースのアーキテクチャでは、標準のQtウィジェットと同じように、ユーザ定義のウィジェットと第三者のカスタムウィジェットを編集することができます。

2つ目の質問では、それぞれのウィジェットに対してQPixmapを作成する方法があります。あなたのウィジェットの外観を変更する必要があるときには、QPaintDevice - QPixmapをとるQPainterのコンストラクタを使用してそのピックスマップを描画します。これはQPaintDeviceです。

あなたのウィジェットのpaintEvent関数では、ウィジェットをその "キャッシュ" pixmapで塗りつぶすだけです。この方法では、実際に必要なときに(潜在的に高価な)絵を描くだけです。

+0

QLidgetの代わりにQLabelを使用すると、派生したクラスを混乱させることなく、直接 'QLabel.setPixmap'を呼び出すことができます。 – vsz

+0

これがカスタムウィジェットを必要とする唯一の理由なら、それはいい考えです – Mat

関連する問題