1

カスタム ウィジェットで 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 としてのみ表示されます。何が間違っている可能性がありますか?

4

2 に答える 2

6

使用する必要がある座標系は、ウィジェットの左上を基準としていますが、明らかにウィジェットの親を基準にした座標系を使用しています。(ウィジェットの x 座標と y 座標は、親に対して相対的です)。したがって、あなたの行は切り取られます。

また、QWidget * パラメータを使用して構築する場合、QPainter::begin と QPainter::end を呼び出す必要はありません。また、コード内のペインターも削除されません。を使用してヒープ上にペインターを作成する必要はありませんnew。スタック上に作成するだけです。

試す:

void myProg::paintEvent(QPaintEvent *pe)
{
    QProgressBar::paintEvent(pe);
    QRect 領域 = pe->rect();
    QPainter ペインター(これ);
    QPen pen(Qt::赤); //注: このように線の色を設定します

    //(筆線を削除。線を引く場合は不要)
    整数 x = 0; //メモが変更されました
    int y = 高さ() / 2; //メモが変更されました
    pen.setWidth(10);
    painter.setPen(ペン);
    painter.drawLine(x,y,x+100,y);

}

これにより、ウィジェットの左中央から 100 ピクセルの長さの赤い水平線が描画されます。

于 2009-05-08T13:22:45.030 に答える
1

あなたが書いたものについてのほんの少しのコメント:

  1. ペインタを構築した方法はQPainter(this)、明示的に呼び出す必要がないことを意味begin()end()、QT がそれを処理します。
  2. QPainterこれを念頭に置いて、デストラクタが呼び出されることはありません。これにより、すべての新しいsが原因で大量のメモリがリークします。
  3. ウィンドウの左上隅を返すと確信していますが、ウィンドウの上部に幅 5 ピクセルの赤い線がまだ表示されているはずthis->x()です。this->y()

QPainters ブラシを設定するときは、QBrushコンストラクターを明示的に 使用してみてください。painter->setBrush( QBrush(Qt::red) );

于 2009-05-08T13:22:10.927 に答える