Qt如何让绘制的仪表指针转动的流畅无闪烁

codeos 2020-08-01 09:08:56
如题,正在做一个设备仪表的界面,指针是 QPainter自己画的,使用的指针和表盘分别是两个 QGraphicsItem ,指针在上表盘在下; 使用 rotate函数进行指针的转动,运行看指针转动效果感觉总不是那么流畅,多少有一点闪烁,看过一些品牌汽车的全液晶中控,他们仪表指针转动非常流畅,不管转动的快还是慢,都非常流畅无闪烁,指针边缘也没有托影; 如何改进可以让指针转动的流畅且无闪烁?
...全文
4541 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
codeos 2020-08-03
  • 打赏
  • 举报
回复
引用 8 楼 这是一个正经昵称 的回复:
想看看代码。
void MainWidget::onValueChanged(QVariant var) {
//    qDebug()<<"var="<<var.toDouble();

    item2->setTransformOriginPoint(200,200);
    item2->setRotation(var.toDouble());

//    graphicsView->rotate(0.5);
}

void MainWidget::onPrint() {
    QVariantAnimation *animation = new QVariantAnimation();

    animation->setStartValue(0);
    animation->setEndValue(360);
    animation->setDuration(8000);
    connect(animation, SIGNAL(valueChanged(QVariant)), this, SLOT(onValueChanged(QVariant)));
    animation->start();

//    timeLine->start();


    qDebug()<<"-- onPrint: ";
}
代码主要就是通过点击按钮触发 onPrint() 然后用 QVariantAnimation动态获取一个0~360度的渐变值,在QVariantAnimation的 onValueChanged 里面对 QGraphicsItem 类型的item2进行旋转操作,item2就是一个指针 Item2的 paint() 函数:
painter->setRenderHint(QPainter::Antialiasing, true);
painter->drawPixmap(0,0, *pixMap);
这个pixMap在Item2的构造函数里面就完成初始化了
Item2::Item2()
{
    pixMap = new QPixmap(400,400);
    pixMap->fill(Qt::transparent);
    QPainter *painter = new QPainter(pixMap);
    painter->setRenderHint(QPainter::Antialiasing);
    painter->setBackgroundMode(Qt::TransparentMode);

    double width = 400;
    double height = 400;
    double centerX = width/2;
    double centerY = height/2;
    double indicatorLen1 = width/40;
    double indicatorLen2 = width/120;

    QPainterPath path;

    path.moveTo(centerX, centerY);
    path.lineTo(centerX-indicatorLen1/2, centerY-indicatorLen1/2);
    path.lineTo(centerX-indicatorLen2/2, 0);
    path.lineTo(centerX+indicatorLen2/2,0);
    path.lineTo(centerX+indicatorLen1/2, centerY-indicatorLen1/2);
    path.lineTo(centerX, centerY);

    painter->setPen(QPen(Qt::transparent));
    painter->setBrush(QBrush(Qt::red));

    painter->drawPath(path);
}
codeos 2020-08-03
  • 打赏
  • 举报
回复
引用 6 楼 mideum 的回复:
别的不知道,不过qml的界面是用opengl的
因为qml底层是 opengl 所以界面刷新速度快,界面就流畅对吧
codeos 2020-08-03
  • 打赏
  • 举报
回复
引用 7 楼 丁劲犇 的回复:
可以试试先渲染到QImage上,而后整体贴图。
我试过先渲染到 QPixmap 上,然后再整体贴图,也是没什么用
  • 打赏
  • 举报
回复
想看看代码。
Italink 2020-08-01
  • 打赏
  • 举报
回复
那可能是你painter的用法不对,我这里尝试过qtimer,17ms刷新,全屏绘制,没有任何卡顿,占用也不高
codeos 2020-08-01
  • 打赏
  • 举报
回复
引用 1 楼 Italink 的回复:
动态刷新,间隔15-20ms不会感觉出卡顿
我看过Qt 自带的demo 里面有个 dashboard的例子,里面的指针转动就相当平滑,效果很好,但是它是qml实现的,里面是用 Canvas绘制的,不知道这个Canvas底层用C++代码是怎么实现的?
codeos 2020-08-01
  • 打赏
  • 举报
回复
我试过,创建一个QTimer定时update, 效果不明显;
Italink 2020-08-01
  • 打赏
  • 举报
回复
动态刷新,间隔15-20ms不会感觉出卡顿
  • 打赏
  • 举报
回复
可以试试先渲染到QImage上,而后整体贴图。
mideum 2020-08-01
  • 打赏
  • 举报
回复
别的不知道,不过qml的界面是用opengl的
codeos 2020-08-01
  • 打赏
  • 举报
回复
能把你的QPainter 设置贴出来看一下么?

16,212

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧