qgraphicsview上的qgraphicsitem旋转时总是在轻微的移动

*若价格不公道,可以让提问者在平台追加赏金哦,平台是您利益的保证

已完成
qgraphicsview上的qgraphicsitem旋转时总是在轻微的移动-青豆都
青豆都 4年前发布
悬赏:200.0 元

问题详情:分类: C++-qt

我在qgraphicsview上添加了scene,然后添加了一个item1,通过定时setRotation让item1以
屏幕为中心不停旋转,然后再在这个item1上添加一个item2,同时通过
setRotation让item2以自己的中心旋转。但是item2旋转时看起来总是在轻微移动,或者闪烁、抖动?

*若价格不公道,可以让提问者在平台追加赏金哦,平台是您利益的保证。你觉得当前的价格如何呢,奉上您珍贵的一票吧

虚高0人次 适中0人次 偏低0人次

分享海报会更快解决你的问题哦!分享海报

参考答案:

刘师傅 4年前解决
已赚540.0元

问题分析:如果是直接绘制文字,在旋转或变换时,因为控件位置的变化,势必引起系统对文字反复进行重绘,体现在窗体上的效果就是多个字母之间间距和位置反复重排,看起来就像虫子在蠕动...
解决方案:就是使用经典的双缓冲思想,先构建缓冲区绘制文字,再将缓冲绘制到控件区
核心代码:覆写控件的paint方法
void BufferedTextItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
Q_UNUSED(widget);
Q_UNUSED(option);
painter->setBackgroundMode(Qt::BGMode::TransparentMode);
painter->setViewTransformEnabled(true);
painter->setRenderHint(QPainter::TextAntialiasing, false);
painter->setRenderHint(QPainter::HighQualityAntialiasing, false);
painter->setRenderHint(QPainter::SmoothPixmapTransform, true);

// 使用字体直接绘制(不能防抖)
// painter->setFont(font);
// painter->drawText(boundingRect().x(), boundingRect().y(),
// boundingRect().width(), boundingRect().height(),
// Qt::AlignCenter, m_text);
// 指定图片大小
QSize size(m_rect.width(), m_rect.height());
// 以ARGB32格式构造一个QImage
QImage image(size,QImage::Format_ARGB32);
// 填充图片背景(这里应该不需要)
image.fill(qRgba(255,255,255,0));
// 为这个QImage构造一个QPainter
QPainter bufferPainter(&image);
// 合成模式,目标在上(改变合成模式和上面的填充可以画出透明的图片)
bufferPainter.setCompositionMode(QPainter::CompositionMode_Source);
// 改变画笔和字体
QPen pen = bufferPainter.pen();
pen.setColor(Qt::white);
QFont font = bufferPainter.font();
font.setFamily(m_font.family());
// 改变字体大小
font.setPointSizeF(m_font.pointSizeF());
font.setBold(m_font.bold());
bufferPainter.setPen(pen);
bufferPainter.setFont(font);
// 关闭反锯齿(不是必须的)
bufferPainter.setRenderHint(QPainter::Antialiasing, false);
bufferPainter.setRenderHint(QPainter::TextAntialiasing, false);
// 在缓冲图像中绘制文字
bufferPainter.drawText(image.rect(),Qt::AlignCenter, m_text);
// 绘制缓冲图像到控件区
painter->drawImage(m_rect, image);
}

此处可发布评论

评论(1

青豆都 能力:10

2020-11-01 20:42:08

补充一下:价格可议。我的需求时解决item2旋转时的轻微移动
点击加载更多
联系大神 成为大神
第一时间了解动态
关注我们
客服QQ 1913284695