スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

さらにQPainterについて

前項QPainter::begin: Widget painting can only begin as a result of a paintEventで、ウィジェットにQPainterで描画を行うにはそのウィジェットのpaintEvent()内で行わなければならないと書いたが、描画デバイスがウィジェットでない場合はこの限りでない。

O'Reillyの「入門Qt4プログラミング」第5章では、あらかじめPixmapを生成しておき、このPixmapに対してQPainterで描画を行っている。この場合は対象がウィジェットではないので、paintEvent()内に限らず任意のタイミングで描画操作を行ってかまわない。そして、最終的な描画対象となるウィジェットのpaintEvent()内で、QPainterのdrawPixmap()メソッドを使用して既に生成済みのPixmapをウィジェットにコピーすればいいわけである。

この方法を応用すれば実質的な描画のタイミングをpaintEvent()と切り離せるので、覚えておく価値はあるだろう。
スポンサーサイト

QPainter::begin: Widget painting can only begin as a result of a paintEvent

標題のエラーメッセージ、

QPainter::begin: Widget painting can only begin as a result of a paintEvent

であるが、アプリケーション内で子ウィジェットを生成してそれにQPainterで描画を行おうとすると遭遇する。たとえばこんな具合のコードで発生する。

QWidget child = new QWidget;
QPainter painter(child);
QPen pen(Qt::white, 2);
painter.setPen(pen);
painter.drawLine(0.0, 0.0, 100.0, 0.0);

調べてみたところ、あまりドキュメントや手持ちの本に明確に書かれていないのだが、どうやらQPainterを使ってウィジェットに描画を行う場合、かならずそのウィジェットのpaintEvent、あるいはそこから呼び出される関数内で行う必要がある。つまり、QPainterによる描画が行われるウィジェットは、必ずpaintEventをオーバーライドする必要がある。さらにいうと、あるウィジェットなりアプリケーションなりのpaintEvent内で、他のウィジェットに描画しようとしてもだめなのである。必ず、そのウィジェット自身のpaintEvent内で描画が行わなければならない。別の言い方をすれば、あるウィジェットに対してQPainterを使って描画を行いたいならば、既製ウィジェットを継承して独自のクラスとして定義する必要があるということだ。

描きたいものがテキストやイメージデータなら、場合によっては、継承によって扱うクラスを増やす代わりに、そのテキストなりイメージなりを貼り付けたQLabelを生成し、それを描画したいウィジェットの任意の位置に子ウィジェットとして載せるという方法でもいいかもしれない。

続きを読む

プロフィール

GM3D

Author:GM3D
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
FC2カウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。