Qt4如何在小部件内部绘制?
Qt4,QtCreator 我试图在小部件内部绘制: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
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上绘制并将其分配给标签。我用上面的代码添加了一个更新。