web-dev-qa-db-ja.com

Qt4ウィジェット内に描画する方法は?

Qt4、QtCreator

ウィジェット内に描画しようとしています:

void Widget::on_pushButton_clicked()
{
    QPainter Painter;

    Painter.begin(ui->label);

    QRectF rectangle(10.0, 20.0, 80.0, 60.0);
     int startAngle = 30 * 16;
     int spanAngle = 120 * 16;
     Painter.drawArc(rectangle, startAngle, spanAngle);

    Painter.end();
}

しかし、ボタンを押しても何も起こりません。

これを正しい方法で行う方法は?

16
Astronavigator

paintEvent() をオーバーライドして、そこでペイントを行う必要があります。 begin()end()は本当に必要ありません。で画家を宣言する

_QPainter Painter(this);
_

コンストラクターはbegin()を処理し、Painterオブジェクトがスコープ外に出て破棄されると、end()が呼び出されます。

また、ペイントをトリガーするためにクリックイベントは必要ありません。 paintEvent()は、ウィジェットがそれ自体を描画する必要があるときはいつでも呼び出されます。ボタンクリックを使用して、paintEvent()がチェックするブール値を切り替えて、長方形と円弧を表示するかどうかを決定できます。変数を切り替えた後は、必ずupdate()を呼び出してください。

_void Widget::on_pushButton_clicked()
{
    drawShapes = !drawShapes;
    update();
}

void Widget::paintEvent(QPaintEvent *)
{
    QPainter Painter(this);

    if(drawShapes)
    {
        QRectF rectangle(10.0, 20.0, 80.0, 60.0);
        int startAngle = 30 * 16;
        int spanAngle = 120 * 16;
        Painter.drawArc(rectangle, startAngle, spanAngle);
    }
}
_

更新:

ウィジェットのpaintEvent()をオーバーライドする必要をなくすために、QLabelを使用して、ウィジェットにピックスマップを割り当て、それにペイントすることができます。注:私が知る限り、ピックスマップを変更するたびに設定する必要があります。

_void MainForm::slot_buttonClick()
{
    QPixmap pixmap(100,100);
    pixmap.fill(QColor("transparent"));

    QPainter Painter(&pixmap);
    Painter.setBrush(QBrush(Qt::black));
    Painter.drawRect(10, 10, 100, 100);

    label.setPixmap(pixmap);
}
_
26
Arnold Spence

Arnold Spenceの説明に従ってPaintメソッドを上書きする場合は、親のpaintEventを呼び出す必要があります。そうしないと、白い背景に長方形のみを表示するウィジェットが作成されます。

1