paintEventをオーバーライドするqtの問題
-
22-07-2019 - |
質問
カスタムウィジェットでQProgressBarをサブクラス化して、 paintEvent メソッドを次のコードで上書きしました:
void myProg::paintEvent(QPaintEvent *pe)
{
QProgressBar::paintEvent(pe);
QRect region = pe->rect();
QPainter *painter = new QPainter(this);
QPen *pen = new QPen;
painter->begin(this);
painter->setBrush(Qt::red);
int x = this->x();
int y = this->y();
pen->setWidth(10);
painter->setPen(*pen);
painter->drawLine(x,y,x+100,y);
painter->end();
}
ウィジェットに独自の変更を追加できることを確認するために、開始点として赤い線を表示しようとしています。ただし、これは機能しません。ウィジェットは通常のQProgressBarとしてのみ表示されます。何が間違っている可能性があるかについてのアイデアはありますか?
解決
使用する必要がある座標系は、ウィジェットの左上を基準にしていますが、ウィジェットの親を基準にした座標系を使用しているようです。 (ウィジェットのx座標とy座標は、親に相対的です)。したがって、行はクリップされます。
また、QWidget *パラメータを使用してQPainter :: beginおよびQPainter :: endを作成する必要はありません。また、コード内のペインタも削除されません。 new
を使用してヒープ上にペインタを作成する必要はありません。スタック上に作成するだけです。
試してください:
void myProg::paintEvent(QPaintEvent *pe) { QProgressBar::paintEvent(pe); QRect region = pe->rect(); QPainter painter(this); QPen pen(Qt::red); //Note: set line colour like this //(Brush line removed; not necessary when drawing a line) int x = 0; //Note changed int y = height() / 2; //Note changed pen.setWidth(10); painter.setPen(pen); painter.drawLine(x,y,x+100,y); }
これにより、ウィジェットの左中央から100ピクセルの赤い水平線が描画されます。
他のヒント
あなたが書いたものについてのコメント:
- ペインターの構築方法
QPainter(this)
は、begin()
およびend()
を明示的に呼び出す必要がないことを意味します。 、QTが自動的に処理します。 - そのことを念頭に置いて、デストラクタが呼び出されることはありません。これは、すべての新しい
QPainter
のために大量のメモリをリークします。 -
this-> x()
およびthis-> y()
はウィンドウの左上隅を返すと確信していますが、ウィンドウの上部に幅5ピクセルの赤い線が表示されます。
QPainter
sブラシを設定するときは、次のように QBrush
コンストラクタを明示的に使用してみてください。
painter-> setBrush(QBrush(Qt :: red));
所属していません StackOverflow