Qt开发之汽车3D中控仪表盘

发布时间 2023-10-24 17:48:26作者: TechNomad

一、绘制背景圆形

void MainWindow::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    QPoint center(width() / 2, height() / 2);
    painter.save();

    //绘制背景圆形
    /*
       用于在绘图过程中对绘图坐标系统进行平移(移动)的操作。
       平移坐标系统到窗口中心,未移动前,左上角的窗口坐标为(0, 0),
       而移动后此时的窗口中心的坐标为(0, 0)
    */
    painter.translate(center);
    painter.setPen(Qt::NoPen);
    painter.setBrush(QColor(142, 142, 142));
    const int bkRadius = m_radius + 3;
    painter.drawEllipse(QPoint(), bkRadius, bkRadius);

    QWidget::paintEvent(event);
}

效果如下:  

(1).setRenderHint函数

函数原型如下:

void QPainter::setRenderHint(RenderHint hint, bool on = true);

参数 hint 是一个枚举值,用于指定要设置的渲染提示,而 on 参数用于指定是否启用(true)或禁用(false)该渲染提示。

以下是一些常见的渲染提示和它们的作用:

  • Qt::Antialiasing:启用抗锯齿,使图形边缘更平滑,减少锯齿现象。

  • Qt::TextAntialiasing:启用文本抗锯齿,用于平滑文本的显示。

  • Qt::SmoothPixmapTransform:启用平滑的图像变换,用于平滑缩放和旋转图像。

  • Qt::HighQualityAntialiasing:启用高质量的抗锯齿,通常用于高质量绘图,但会消耗更多的计算资源。

  • Qt::NonCosmeticDefaultPen:使绘制的线条宽度不受变换的影响,即使进行缩放或旋转,线条仍然具有相同的宽度。

  • Qt::FastTransformation:使用更快的图像变换算法,可能牺牲一些质量。

  • Qt::NoAntialiasing:禁用抗锯齿,使图形以锯齿边缘绘制。

  • Qt::TextAntialiasing:禁用文本抗锯齿,以获得更清晰的文本显示。

(2).save函数

QPainter 类中的 save 函数用于保存绘图上下文的状态,包括绘图变换、画笔、画刷、字体等属性的设置。通过调用 save 函数,你可以保存当前绘图状态,然后在之后的绘图操作中进行修改,而后通过 restore 函数将状态还原到之前保存的状态,以便实现绘图状态的堆栈管理。

save 函数没有参数,它的调用形式如下:

void QPainter::save();

以下是一些使用 saverestore 的常见场景和示例:

保存和还原绘图状态:

QPainter painter(this);
painter.setPen(Qt::red);
painter.save();  // 保存当前绘图状态
painter.setPen(Qt::blue);
// 在这里使用蓝色画笔绘制
painter.restore();  // 恢复之前保存的状态(红色画笔)
// 在这里继续使用红色画笔绘制

在上面的示例中,我们首先将绘图状态保存,然后修改画笔颜色,接着通过 restore 函数将画笔颜色还原到之前保存的状态。

使用 saverestore 绘制多个图形:

QPainter painter(this);
painter.setPen(Qt::red);

painter.save();  // 保存当前绘图状态
painter.drawRect(10, 10, 50, 50);  // 使用红色画笔绘制一个矩形

painter.restore();  // 恢复之前保存的状态
painter.setBrush(Qt::blue);
painter.drawEllipse(70, 70, 40, 40);  // 使用蓝色画刷绘制一个椭圆

通过 saverestore,你可以更轻松地管理和切换不同的绘图状态,而不必手动跟踪每个属性的更改。这对于复杂的绘图操作和需要在不同图形元素之间切换绘图属性的场景非常有用。  

(3).translate函数

QPainter 中的 translate 函数是用于在绘图过程中对绘图坐标系统进行平移(移动)的操作。它的作用是将绘图坐标原点沿着指定的水平和垂直方向移动一定的距离,以便在绘制图形时更容易控制位置。

translate 函数的原型如下:

void QPainter::translate(const QPointF &offset);
void QPainter::translate(const QPoint &offset);
void QPainter::translate(qreal dx, qreal dy);

这些重载的函数允许你指定平移的偏移量,可以是 QPointF(浮点数坐标点),QPoint(整数坐标点),或者两个浮点数 dxdy 分别表示水平和垂直方向的平移距离。

当你调用 translate 函数后,所有后续的绘图操作都将相对于新的坐标原点进行,而不是相对于原始的坐标原点。这对于在特定位置上绘制图形或进行坐标转换非常有用。

以下是一个简单的示例,演示如何使用 QPaintertranslate 函数来平移坐标系统:

QPainter painter(this);
painter.translate(100, 100);  // 平移坐标系统到 (100, 100)
painter.drawRect(0, 0, 50, 50);  // 绘制一个矩形,相对于新的坐标原点 (100, 100)