質問

カスタムウィジェットで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ピクセルの赤い水平線が描画されます。

他のヒント

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top