スポンサーサイト

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

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を生成し、それを描画したいウィジェットの任意の位置に子ウィジェットとして載せるという方法でもいいかもしれない。
と書いてからもう一度良くQPainter Class Referenceをチェックしたら、"Warning"のところに書いてあった。

"ペイントデバイス(描画されるデバイス)がウィジェットの場合、Qt::WA_PaintOutsidePaintEventアトリビュートがセットされていない限り、QPainterはpaintEvent()関数か、そこから呼び出される関数の中でしか用いることができない。Mac OSとWindowsではこのアトリビュートの設定に関わりなく、paintEvent()の中でしか用いることができない。"

とな…なるほどね、Warningじゃなくて最初に書いてよ!
スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

GM3D

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

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

この人とブロともになる

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