我是Qt的新手。我使用继承QGraphicsPolygomItem
的自定义类将我的应用程序中的事件表示为场景中的多边形。多边形尺寸为(event duration, fixed height)
,使用1s:1px。事件持续时间可以低至1E-6,因此我只是缩放视图,以便将较小的多边形放大到MIN_POLY_WIDTH
(10px):
view->scale(qreal(MIN_POLY_WIDTH/min_event_duration), qreal(1.0));
到目前为止一切顺利。但是,每个多边形都有一个QGraphicsTextItem
子元素,它通过缩放操作拉伸到它们超出多边形边界的点:
文本项创建如下:
void EventPolygon::setId(QString id) {
if (!this->id) {
this->id = new QGraphicsTextItem(id, this);
} else {
this->id->setPlainText(id);
}
this->id->setPos(0, this->polygon().boundingRect().height() / 2 - this->id->boundingRect().height() / 2);
}
该函数通常由EventPolygon
构造函数调用。我认为这是问题,因为scale
是在所有项目添加到场景后完成的,因此会影响文本项目。所以我尝试在缩放操作之后调用setId
,迭代场景中的所有项目。那样的话,我只会拉伸多边形。事实并非如此,案文仍然紧张。
我还尝试使用以下代替scale
:
QTransform t = QTransform();
t.scale(qreal(MIN_POLY_WIDTH/min_event_duration), qreal(1.0));
view->setTransform(t, false);
我认为“假”会避免将变换应用于多边形子项,但似乎并非如此。有什么方法可以将多边形缩放到10px宽度min并在其中包含可读文本吗?
答案 0 :(得分:1)
QGraphicsScene
根据父子关系形成场景图层次结构,转换在此层次结构中继承 - 没有办法绕过它(参见转换部分here)。
因此,为了解决您的问题,您需要让子QGraphicsTextItem
反转父级的缩放变换乘以视图的缩放。
实际上我真的建议您从不设置视图转换,因为这个原因不能模拟相机操作(平移,缩放等)。我只是允许每像素的秒数变化,并允许子项目从视图中查询 - 换句话说,进度项在屏幕上处理它们自己的大小。
情况并非如此,文字仍然很紧张。
更改转换堆栈会导致重绘,这就是 设置比例时无关紧要的原因。
我认为“假”会避免转换应用于 多边形儿童
不,{false}时的combine
参数只会覆盖现有的转换矩阵与您提供的转换矩阵。