qgraphicsview上的qgraphicsitem旋转时总是在轻微的移动
*若价格不公道,可以让提问者在平台追加赏金哦,平台是您利益的保证
已完成
问题详情:分类: C++-qt
我在qgraphicsview上添加了scene,然后添加了一个item1,通过定时setRotation让item1以
屏幕为中心不停旋转,然后再在这个item1上添加一个item2,同时通过
setRotation让item2以自己的中心旋转。但是item2旋转时看起来总是在轻微移动,或者闪烁、抖动?
屏幕为中心不停旋转,然后再在这个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);
}
此处可发布评论