在 qt 中使用 2 个图像编写仪表小部件

Posted

技术标签:

【中文标题】在 qt 中使用 2 个图像编写仪表小部件【英文标题】:writing a gauge widget using 2 images in qt 【发布时间】:2018-03-08 12:34:50 【问题描述】:

我正在使用 QT 编写一个仪表小部件,它由 2 个单独的图像构成,一个作为背景,另一个作为 Needle。我重新实现了paintEvent函数如下:

void myGaugeWidget::paintEvent(QPaintEvent *pe)

    QPainter painter(this);
    QPixmap bkgImage(bkgImgPath);
    painter.drawPixmap(0, 0, width(), height(), bkgImage);

    const double thetaDeg = 30.0;
    QPixmap needle(needles[i].imgPath);
    int needleWidth = 200;
    int needleHeight = 200;

    int anchorX = 20;
    int anchorY = 30;
    const int centerX = width()/2;
    const int centerY = height()/2;

    QTransform rm =  QTransform().translate(-anchorX,- anchorY).rotate(thetaDeg).translate(centerX,centerY);
    needle = needle.transformed(rm);
    painter.drawPixmap(0,0, needle);

此代码正确旋转了我的针,但它的位置不正确。 有谁能够帮助我? 谢谢。

【问题讨论】:

您可以提供 2 张图片来查看问题所在,也可以显示您遇到的问题的图片。 【参考方案1】:

这很可能取决于您的图像和小部件大小。我试过你的代码,在我看来QTransform().translate() 没有在QPixmap 中做任何事情。我试图为translate() 提供极值并删除rotate() - 图像不会移动。

我已经有了自己的仪表实现。这是画家转换而不是图像。我的图片尺寸:

仪表背景:252x252(圆形边界周围有一些外部模糊效果,使背景图像比看起来更大)

针:7x72(图像尺寸环绕针本身的边界)

针旋转中心(相对于背景):126、126(背景大小除以2)

针的图像指向上方

对于这个设置,这里是我的paintEvent() 以及一些解释:

void myGaugeWidget::paintEvent(QPaintEvent *)

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    
    //draw the background which is same size as the widget. 
    painter.drawPixmap(0, 0, bg.width(), bg.height(), bg);
    
    //Calculate the angle of rotation. 
    //The gauge I am using has a cutout angle of 120 degrees at the bottom (symmetric)
    float needleAngle = -120/*offset for start rotation*/ + ((value-minValue)*240/*total sweep of the gauge*//(maxValue-minValue));
    painter.save();

    //translate the painter to the roation center and then perform the rotation
    painter.translate(126, 126);
    painter.rotate(needleAngle);

    //translate the rotated canvas to adjust for the height of the needle. 
    //If you don't do this, your needle's tip will be at the rotation center
    painter.translate(0, -72);

    //draw the needle and adjust for the width with the x value
    painter.drawPixmap(-needle.width()/2, 0, needle.width(), needle.height(), needle);
    painter.restore();

【讨论】:

以上是关于在 qt 中使用 2 个图像编写仪表小部件的主要内容,如果未能解决你的问题,请参考以下文章

Qt 自定义小部件如何通知 ScrollArea 父级视图更改

使用 Python 为 Qt Designer 自定义 Qt 小部件

如何轻松快速地调试 Azure Devops 仪表板小部件?

如何为 Qt GUI 小部件使用图像

如何在 Qt 小部件中以 PreserveAspectFit 的比例显示图像

如何避免鼠标单击一个小部件触发 Qt 中其他小部件的信号?