Qt4如何在小部件内部绘制?

Qt4如何在小部件内部绘制?,qt,graphics,qt4,qt-creator,Qt,Graphics,Qt4,Qt Creator,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.drawAr

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();
}
但当我按下按钮时,什么也没发生

如何正确地进行此操作?

您需要覆盖并在那里进行绘制。您实际上不需要
begin()
end()
。向画家宣布

QPainter painter(this);
构造函数将处理
begin()
,当
painter
对象超出范围并被销毁时,将调用
end()

您也不需要单击事件来触发绘制<每当小部件需要绘制自身时,都会调用code>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
并为其分配一个pixmap,然后对其进行绘制。注意:据我所知,每次修改pixmap时都需要设置它

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);
}

如果您按照Arnold Spence所述覆盖绘制方法,则应调用父级的paintEvent,否则您将得到一个只在白色背景上显示矩形的小部件。

有没有办法在不覆盖的情况下绘制?或者是否有任何组件可以在没有任何事件的情况下进行绘制,如TImage或TForm或任何其他在VCL(Delphi)中包含TCanvas的组件?(在Delphi中,只要我需要,就可以编写Form1.Canvas.Circle(…),而不仅仅是在onpaint事件中)我从来没有尝试过在小部件外部使用代码绘制小部件,但QWidget确实继承了PaintDevice,所以应该可以。从QPaint的文档中删除它。。警告:当paintdevice是一个小部件时,QPaint只能在paintEvent()函数内部或paintEvent()调用的函数中使用;除非设置了Qt::WA_PaintOutsidePaintEvent小部件属性。在Mac OS X和Windows上,无论该属性的设置如何,您都只能在paintEvent()函数中绘制您可以使用QLabel和QPixmap,在pixmap上绘制并将其分配给标签。我用上面的代码添加了一个更新。