问题标签 [qpainterpath]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
101 浏览

c++ - QPainterPath toFillPolygon() 返回比用于绘制路径本身的点更多的点

我一直在尝试使用 18 个不同的关节来绘制人的骨骼点。所以,我决定使用QGraphicsPathItem. 我可以成功生成如下所示的项目:(请原谅我的绘画技巧)

在此处输入图像描述

为了实现这一点,我使用了:

在某个时间点,当我想知道点的位置时,我使用:

这给我 33 分而不是 18 分。

有没有办法从路径()获取我开始的那 18 个点的当前位置?

编辑1:比较toFillPolygon()开放多边形(起点和终点不同)和封闭多边形的结果后,我意识到开放多边形(如我的情况)toFillPolygon()将不起作用或返回错误值。

0 投票
1 回答
122 浏览

python - PyQt 沿 QPainterPath 绘制 QPixmap

我想在我的 QGraphicsView 中沿着 QGraphicsPathItem 绘制模式(最好是 QPixmap)。这应该类似于使用QBrush.setTexture("example.png"). 有没有办法在 QPen 上做到这一点?我在 PyQt 文档中找不到与此相关的任何内容。

纹理应与此示例图片类似

纹理是保持自己的宽度还是缩放到 QPen 的宽度都没有关系。

是否有某种形式的解决方法来实现这一点?我正在考虑使用 QTransform 将 QPixmap 转换为所需的 QGraphicsPathItem 的形状。

0 投票
0 回答
231 浏览

c++ - 如何检测鼠标悬停在 Qt 中的线图上?

我是新手C++,这是在 Stack Overflow 上Qt的第一篇文章。Visual Studio

如果这是一个重复的问题,我提前道歉,我尝试搜索类似的问题但找不到。如果这是一个重复的问题,请告诉我,我将删除它。

我正在尝试使用QWidget::paintEvent(). 我正在绘制的线图实际上是一个QPainterPath. 我想检测鼠标何时悬停在我的线图上,因此我在鼠标光标所在的位置创建了一个小矩形,并使用bool QPainterPath::intersects()函数检测该矩形何时与我的线图相交。问题是即使我的鼠标不在我的线图上,这个函数也会返回 true。在图像 1中(我还不允许嵌入图像)我的线图是粗黑色曲线,bool QPainterPath::intersects()即使我的光标位于黄色区域上也返回 true。根据 Qt 文档,这是因为:

如果构成矩形的任何线与路径的一部分相交,或者矩形的任何部分与路径所包围的任何区域重叠,则存在交叉点。

没有任何封闭区域是不可能的,QPainterPath因为 Qt 只为QPainterPath:Qt::OddEvenFillQt::WindingFill. (老实说,我觉得这很烦人,因为开放路径是一系列端到端连接的线段,如果有人想包围一个区域,他们可以使用QPainterPath::lineTo()QPainterPath::moveTo()函数轻松连接第一个点和最后一个点)

无论如何,我决定变得更聪明,并在我的线图上方几个像素和在我的线图下方几个像素处Qt画了两个额外QPainterPath的。图 2显示了这 3 个线图,红色的是,黑色的是实线图,绿色的是。我想我可以使用以下代码检测到交叉点:pathUppathDnpathUppathDnQWidget::mouseMoveEvent()

但这仍然会产生错误的结果,因为现在封闭区域不同了,如图3所示,绿色区域是 的封闭区域,pathDn红色区域是 的封闭区域pathUp。粗黑曲线再次是我想要检测鼠标悬停在其上的线图。这个封闭区域不受 的Qt::setFillRule影响QPainterPath

更令人沮丧的是,我使用QPolygonF而不是QPainterPathon尝试了这种技术QWidget,结果完全一样。我也尝试过QGraphicsView,我曾经QGraphicsPathItem在那里创建我的线图,然后使用QGraphicsScene::focusItemChanged()信号来检测我何时点击我的线图。当我的光标位于封闭区域上时,它再次产生了检测点击的相同结果。我不想创建一个自定义QGraphicsItem(除非我绝对必须)只是为了重新实现它hoverEnterEvent()和方法,因为Qt Docs 中解释了对的hoverLeaveEvent()限制:boundingRect()QGraphicsItem

QGraphicsScene 期望所有项目 boundingRect() 和 shape() 保持不变,除非它被通知。如果您想以任何方式更改项目的几何图形,您必须首先调用 prepareGeometryChange() 以允许 QGraphicsScene 更新其簿记。

由于我实时绘制绘图,因此boundingRect()会非常频繁地更改(> 20 Hz),这会给软件带来额外的计算负担。有什么方法可以在不创建自定义的情况下解决我的问题QGraphicsItem

PS 多年来,每当我遇到困难时,我一直在使用 Stack Overflow。我只是从来没有在这里开过账户,因为我从来不需要发布任何东西。你们是最棒的,我很高兴成为这个社区的一员!

0 投票
1 回答
72 浏览

qt - 单击QPushButton后如何更改QPainterPath颜色

我对 a 进行了子类化,QPushButton以便能够重新实现paintEvent(QPaintEvent *paint)官方文档也建议的方法。

以下是操作顺序:

a)启动应用程序后,按钮如下:

b

b)这是在我将鼠标悬停在它上面之后:

C

c)然后我点击按钮:

b

d) 最后我松开鼠标

d

e) 远离按钮

b

然而问题是QPainterPath我设计的绿色盒子在我释放按钮后应该是红色的。当然,在我再次单击该按钮后,它应该再次变为绿色。

代码下方:

自定义按钮.h

自定义按钮.cpp

主窗口.h

主窗口.cpp

正如您在MainWindow我创建的函数onClickedButton()中看到的那样,我认为单击后会触发QPainterPath变为红色。为了做到这一点,我将它转换成一个对象(qobject_cast)。但不幸的是,它并没有像expexted那样工作。

0 投票
1 回答
61 浏览

c++ - 为什么 QPainterPath::contains() 不是线程安全的,尽管是 const?

虽然我知道 QT 声明只有特别声明的类是线程安全的,但我想了解为什么一个“const”标记的方法 - QPainterPath::contains() - 在没有任何并发​​的并行循环中调用它时会中断写操作:

上面的代码在不应该的时候随机输出“失败”。

我的理解是,尽管方法是“const”,但它正在以某种方式改变其内部状态: https ://code.woboq.org/qt5/qtbase/src/gui/painting/qpainterpath.cpp.html#_ZNK12QPainterPath8containsERK7QPointF

我需要比较点是否在多个线程的路径内(以加快处理速度),但它不适用于 QPainterPath。即使我为每个线程创建了对象的副本,QT 也会在写入时复制,除非我更改派生对象(强制它分离),否则结果仍然是相同的错误行为,因为它仍然使用相同的共享数据。如果没有这个丑陋的黑客,我怎样才能以安全的方式做到这一点?

0 投票
1 回答
37 浏览

pyqt - 在 PyQt 中绘制具有多个偏离曲线点的贝塞尔曲线

我想用 PyQt5 QPainterPath 绘制一个 TrueType 字体字形。字形片段示例:(来自 Fonttools ttx 的数据)

on=0 表示控制点,on=1 表示起点/终点我假设这不会使用 (QPainterPath) quadTo 或cubicTo,因为它是更高阶的曲线。