Ast*_*tor 14 graphics qt qt4 qt-creator
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();
}
Run Code Online (Sandbox Code Playgroud)
但是当我按下按钮时没有任何反应.
怎么做正确的方法?
Arn*_*nce 24
你需要覆盖paintEvent()并在那里做你的绘画.你真的不需要begin()和end().宣布画家
QPainter painter(this);
Run Code Online (Sandbox Code Playgroud)
构造函数将处理begin(),并end()在painter对象超出范围并被销毁时调用.
您也不需要click事件来触发绘画.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);
}
}
Run Code Online (Sandbox Code Playgroud)
更新:
为了避免必须覆盖paintEvent()窗口小部件,您可以使用a 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);
}
Run Code Online (Sandbox Code Playgroud)