- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的 Qt 4.8.1 C++ 类绘制十字准线子类 QGraphicsItem 并实现其 paint()和 boundingRect()方法。paint() 方法由两次 drawLine() 和一次 drawText() 调用组成。原点居中。boundingRect() 还考虑这些坐标(-、-、+、+)以及每个方向的半笔宽。
当创建、移动(或定位)然后将对象添加到(可见)场景时, View 会移动几个像素,以便场景内容稍微移动到右下角。如果 boundingRect() 返回一个空的 QRectF(),则不会发生这种转变。
itemChange() 被多次调用但似乎没有提供任何线索(在我看来):
Crosshair::Crosshair being created, id= "1" at QPointF(63.6, 88.487) scenePos= QPointF(33.6, 58.487)
Crosshair::Crosshair position QPointF(63.6, 88.487)
Crosshair::itemChange ItemFlagsChange QVariant(uint, 1)
Crosshair::itemChange ItemFlagsHaveChanged QVariant(uint, 1)
Crosshair::itemChange ItemFlagsChange QVariant(uint, 33)
Crosshair::itemChange ItemFlagsHaveChanged QVariant(uint, 33)
Crosshair::itemChange ItemFlagsChange QVariant(uint, 2081)
Crosshair::itemChange ItemFlagsHaveChanged QVariant(uint, 2081)
[...]
Crosshair::itemChange ItemPositionChange QVariant(QPointF, QPointF(63.6, 88.487) )
Crosshair::itemChange ItemPositionHasChanged QVariant(QPointF, QPointF(63.6, 88.487) )
Crosshair::itemChange ItemSceneChange QVariant(QGraphicsScene*, )
Crosshair::itemChange ItemSceneHasChanged QVariant(QGraphicsScene*, )
[...]
Crosshair::boundingRect 20 3 QRectF(-11.5,-11.5 21.5x21.5)
Crosshair::boundingRect 20 3 QRectF(-11.5,-11.5 21.5x21.5)
Crosshair::itemChange ItemVisibleChange QVariant(bool, true)
Crosshair::itemChange ItemVisibleHasChanged QVariant(bool, true)
Crosshair::boundingRect 20 3 QRectF(-11.5,-11.5 21.5x21.5)
Crosshair::boundingRect 20 3 QRectF(-11.5,-11.5 21.5x21.5)
...
明天我也许可以创建一个最小的示例,但也许有人甚至可以从问题的一般描述中猜出我的错误。或者,当然非常欢迎进一步调试的提示!
QRectF(0,0 1680x636)
到
QRectF(-11.5,-11.5 1691.5x647.5)
。场景的 itemsBoundingRect 保持不变。现在我之前没有提到 View 已使用
fitInView(scene()->itemsBoundingRect(), Qt::KeepAspectRatio);
进行了缩放/转换,并注意到当以 100% 比例查看场景(例如
resetTransform()
)。但是我仍然不明白当我在 boundingRect() 中添加元素时 sceneRect() 如何/为什么会发生变化。这一定与我的自定义实现有关,因为添加椭圆不会导致场景/ View 发生偏移。
好吧,我们开始吧:我也没有提到我使用了 setFlag(QGraphicsItem::ItemIgnoresTransformations);
以便无论比例如何,十字准线都保持相同的大小。这显然会导致 boundingrect 在添加时“停留”在场景的原点,并忽略 setPos()。
待续...
最佳答案
场景有一个边界矩形,默认情况下它是包含所有项目的最小矩形。如果您在此矩形之外的场景中添加某些内容,则边界矩形将被扩展。
View 尊重场景的矩形。如果场景的矩形小于 View 的视口(viewport)大小, View 的滚动条将被隐藏,场景内容显示在视口(viewport)的中心。因此,如果您添加一个项目,场景的边界矩形会发生变化并且所有内容都会发生变化。如果视口(viewport)小于边界矩形,则会出现滚动条。
如果您想避免这种行为,您可以使用QGraphicsView::setSceneRect
或QGraphicsScene::setSceneRect
来固定矩形位置。请注意,设置矩形之外的所有内容在 View 中都不可用且不可见。
同时考虑切换到 QGraphicsPathItem
(和 QGraphicsScene::addPath
)。它可以用来画十字准线。
关于c++ - 为什么自定义 QGraphicsItem 会导致场景或 View 移动,除非 boundingRect 为空?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17553530/
我正在编写一个带圆圈的物理模拟。 Ball.cpp 代码: Ball::Ball() { angle = 0; setRotation(angle); //set the
尝试在 opencv 中使用 boundingRect() 函数时出现错误。给出的是点列表 lists = [] for match in enumerate(matches): lists.
我在使用以下代码时遇到了非常奇怪的问题。 extension String { func height(withConstrainedWidth width: CGFloat, fon
我在使用 QFontMetrics 的“boundingRect”函数时遇到问题,它没有返回正确的结果。 mfntArial = QFont("Arial", 12, QFont::Bold)
我有一些代码,我可以在其中绘制符号并将其附加到绘图中。现在我想知道是否有一个用符号自动创建的边界矩形,这样我就可以编写一些代码来选择符号,以便用户可以编辑它 - 例如选择它以便删除它。 我在 qwt_
我试图在用户移动 QGraphicsRectItem 时获取它的子类的 boundingRect() 。但是,随着矩形在场景中移动,boundingRect() 返回的矩形始终返回边界矩形的原始值。下
我有一个 class Edge : public QGraphicsItem,它实现了从一个节点到另一个节点的绘制箭头(下图)。 现在我需要添加在自己身上画箭头的功能 (arc)。 我无法绘制弧线,覆
我像这样计算 NSAttributedString 的高度。 let maxSize = NSSize(width: w, height: CGFloat.greatestFiniteMagnitud
我一直在尝试使用 QGraphicsItemGroup 来获取一组 QGraphicsItem* 的边界矩形。在我看来,当我将所有项目插入组中时,边界矩形已正确确定;但是如果我随后移动组中的项目,边界
QGraphicsItem::boundingRect () 是一个虚函数,所以我重写了它来处理我自己的一些东西,然后我发现它被重复调用,但我从未从我自己的代码中显式调用它。 谁在召唤它?表演或绘画之
我是 OpenCV 和 Python 的新手,我制作了一个程序来查找面积大于 500 的轮廓并将它们保存到新图像中我按照互联网上的建议使用了 boundingRect,它运行并完成了工作但我得到了图像
谷歌搜索 suggests that it should . 但是拖放机器人 example implementation (在父 Robot 对象上)建议不要: QRectF Robot::boun
我想实现一个 QGraphicsElement,它在圆角矩形内“按原样”绘制文本。 为了实现 QGraphicsElement 我需要实现 boundedRect 函数,所以我需要原样的多行消息的 b
当我尝试通过 NSString 函数 boundingRect 包装到盒子中并注意初始插入 (8,0,8,0) 时,我尝试使用以下方法计算文本的每一帧: let size = CGSize(width
在我的应用程序中,我在UITextView中的文本行下绘制自定义背景。为此,我使用boundingRect(forGlyphRange:in:)的NSLayoutManager方法。它适用于LTR语言
Kwadrat 类有什么问题?我有一个错误: Invalid new-expression of abstract class type 'Kwadrat' Kwadrat* kwadrat = ne
我正在使用 Qt 5.2,我目前正在尝试从 QTableView 打印一个表格,但是我在根据内容计算行高时遇到了这个问题。我现在得到的是下面的循环,它循环遍历 QTableView 行并使用 boun
我以为我可以使用下面的代码在它离开场景后删除任何项目,但事实并非如此。在尝试了不同的实现之后,我想我应该尝试另一种方法。有些 QGraphicsItems 实际上是在 boundingRect 之外开
我目前在 UITextField 上有以下扩展来计算给定字符串的边界矩形。 func widthHeight(font: UIFont) -> CGRect { let constraintR
我已经尝试了多种方法来围绕minAreaRect()创建boundingRect(),但是我一直遇到错误。我可以简单地使用原始轮廓,但是,这是要理解为什么与cv2.isContourConvex()和
我是一名优秀的程序员,十分优秀!