gpt4 book ai didi

c++ - Qt:缩放多边形而不是 child

转载 作者:行者123 更新时间:2023-11-30 05:47:18 26 4
gpt4 key购买 nike

我是 Qt 新手。我使用继承 QGraphicsPolygomItem 的自定义类将来 self 的应用程序的事件表示为场景中的多边形。多边形尺寸为 (事件持续时间,固定高度),使用 1s : 1px。事件持续时间可以低至 1E-6,因此我只需缩放我的 View ,以便将较小的多边形缩放到 MIN_POLY_WIDTH (10px):

view->scale(qreal(MIN_POLY_WIDTH/min_event_duration), qreal(1.0));

enter image description here

到目前为止一切顺利。但是,我为每个多边形都有一个 QGraphicsTextItem 子级,它们通过缩放操作被拉伸(stretch)到超出多边形边界的点:

enter image description here

文本项创建如下:

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 。这样我虽然只有多边形会被拉伸(stretch)。事实并非如此,文本仍然很冗长。

我还尝试使用以下代替 scale:

QTransform t = QTransform();                                                  
t.scale(qreal(MIN_POLY_WIDTH/min_event_duration), qreal(1.0));
view->setTransform(t, false);

我认为“false”会避免将转换应用于多边形子项,但事实并非如此。有什么方法可以将多边形缩放到 10px 最小宽度并在其中包含可读文本?

最佳答案

QGraphicsScene 形成了一个基于父子关系的场景图层次结构,转换沿该层次结构向下继承 - 没有办法解决这个问题(请参阅转换部分 here)。

因此,要解决您的问题,您需要让子级 QGraphicsTextItem 反转父级的缩放变换乘以 View 的缩放。

事实上,出于这个原因,我真的建议您永远不要设置不用于模拟相机操作(平移、缩放等)的 View 转换。我会简单地允许每个像素比率的秒数发生变化,并允许子项能够从 View 中查询它 - 换句话说,让进度项在屏幕上处理它们自己的大小。

That was not the case, and the text remained stretched.

更改转换堆栈将导致重绘,这就是为什么何时设置比例并不重要。

I thought "false" would avoid the transformation being applied to the polygons children

不,combine 参数为 false 时只是用您提供的矩阵覆盖现有的变换矩阵。

关于c++ - Qt:缩放多边形而不是 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28618025/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com