Qt4 如何在小部件内部绘图?
Qt4,QtCreator
我试图在 Widget 内绘制:
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();
}
但是当我按下按钮时什么也没有发生。
如何正确地做到这一点?
Qt4, QtCreator
I am trying to draw inside Widget:
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();
}
But when I press button nothing happens.
How to do this right way?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您需要重写 paintEvent() 并在那里进行绘画。您实际上并不需要
begin()
和end()
。使用 声明画家构造函数将处理
begin()
,并且当painter
对象超出范围并被调用时,将调用end()
被毁了。您也不需要单击事件来触发绘画。每当小部件需要绘制自身时,
paintEvent()
就会被调用。您可以使用按钮单击来切换一个布尔值,paintEvent()
检查该布尔值以确定是否应显示矩形和圆弧。只需确保在切换变量后调用update()
即可。更新:
为了避免重写小部件的
paintEvent()
,您可以使用QLabel
并为其分配一个像素图并绘制那。注意:据我所知,每次修改像素图时都需要设置它。You need to override paintEvent() and do your painting there. You don't really need the
begin()
andend()
. Declare the painter withThe constructor will handle
begin()
, andend()
will be called when thepainter
object goes out of scope and is destroyed.You also won't need the click event to trigger the painting.
paintEvent()
will be called whenever the widget needs to draw itself. You could use the the button click to toggle a boolean that thepaintEvent()
checks to determine whether or not it should display the rectangle and arc. Just make sure you callupdate()
after you toggle the variable.UPDATE:
To avoid having to override the
paintEvent()
of a widget, you could use aQLabel
and assign a pixmap to it and paint to that. Note: As far as I can tell, you will need to set the pixmap each time you modify it.如果您按照 Arnold Spence 的描述覆盖绘制方法,则应该调用父级的 PaintEvent,否则您最终会得到一个仅在白色背景上显示矩形的小部件。
If you overwrite the paint-method as described by Arnold Spence, you should call the parent's paintEvent or you end up with a widget that only shows your rectangle on a white background.