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();
}
但是当我按下按钮时没有任何事情发生。
如何做到这一点?
答案 0 :(得分:23)
您需要覆盖paintEvent()并在那里进行绘画。您实际上并不需要begin()
和end()
。用
QPainter painter(this);
构造函数将处理begin()
,当end()
对象超出范围并被销毁时,将调用painter
。
您也不需要点击事件来触发绘画。只要窗口小部件需要绘制自己,就会调用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);
}
答案 1 :(得分:1)
如果你按照Arnold Spence的描述覆盖paint-method,你应该调用父的paintEvent,或者最终得到一个只在白色背景上显示你的矩形的小部件。