强制QGraphicsItem保持不变
Forcing QGraphicsItem To Stay Put
本文关键字:QGraphicsItem 强制 更新时间:2023-10-16
我有一个用QGraphicsItems
填充的QGraphicsScene
,用户可以平移和缩放以检查所有不同的QGraphicsItems
。然而,我想有一个QGraphicsTextItem
标签,始终保持放在屏幕的左上角。忽略缩放很容易,因为我只需要setFlags(QGraphicsItem::ItemIgnoresTransformations)
,但我还没有弄清楚如何迫使位置保持在左上角。让我的标签"浮动"在同一个地方的最好方法是什么?
我认为唯一可行的方法是每帧重新计算文本项的位置。要做到这一点,只需子类化QGraphicsView,重写paintEvent并使用QGraphicsView::mapToScene()来计算新的位置。比如:
void MyGraphicsView::paintEvent(QPaintEvent*)
{
QPointF scenePos = mapToScene(0,0); // map viewport's top-left corner to scene
m_textItem->setPos(scenePos);
}
我已经这么做过很多次了,效果很好。
当然你可以像Arnold Spence在他的回答中提到的那样创建普通的QLabel。然而,这在很多情况下是行不通的(例如,如果你真的想在图形视图的顶部放置标签,并且你正在使用opengl加速的视口)。
也许你只是想在视图上放一个常规的QLabel
,而不是像这个问题中讨论的那样试图让场景的一部分停留在一个地方。
注意:正如在另一个答案中提到的,这个技巧通常不适用于硬件加速视图。在这些情况下,你需要使文本项成为场景的一部分。
相关文章:
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 强制转换为引用类型
- 强制调用WM_PAINT
- 如何修复函数样式强制转换或类型构造的预期"("?
- 存储模板类型以强制转换回派生<T>
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 函数作为模板参数,是否对返回类型强制约束
- 从成员指针到整个结构/类的强制转换
- 为什么g++在未执行的代码处标记强制转换错误
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- 将QGraphicsItem的移动区域限制在多边形区域内
- 将父类对象强制转换为子类的问题
- enable_if转换构造函数(静态强制转换,is_base_of)
- 是否有内置方法可以强制转换为不同的基础类型,但保留常量限定符?
- 如何强制从重写方法调用重写的方法基方法?
- 为什么 c++ 不允许(自动)强制转换?
- 将字符缓冲区强制转换为函数指针
- 使用指针在C++进行强制转换
- 强制QGraphicsItem保持不变