我正在使用PyQt5。我正在制作一个机器人在迷宫中移动的程序。 为此,我使用QGraphicsScene。我添加像QRect这样的对象来代表机器人。背景通过SetBackgroundBrush设置并从png图像加载(黑色表示不可通过的地形):
def update_background(self):
qim = QImage(self.model.map.shape[1],self.model.map.shape[0], QImage.Format_RGB32)
for x in range(0, self.model.map.shape[1]):
for y in range(0, self.model.map.shape[0]):
qim.setPixel(x ,y, qRgb(self.model.map[y,x],self.model.map[y,x],self.model.map[y,x]))
pix = QPixmap(qim)
self.scene.setBackgroundBrush(QBrush(pix))
我现在想要做的是可视化寻路算法的工作(我现在使用A *)。就像一条连接机器人的红线,它的目的地弯曲在障碍物上。该行存储为(X,Y)坐标列表。我想迭代列表并在场景上逐个像素地绘制。但是我不知道该怎么做 - 没有“drawPixel”方法。当然,我可以添加一百个1x1大小的小矩形。但是,如果路线发生变化,我将不得不重新绘制它们。
我想过用路径创建一个图像并将其放在FOREground然后添加。但是我无法做出透明的前景。这不是背景问题(因为它在后面)。我考虑过使用 theis功能: http://doc.qt.io/qt-5/qpixmap.html#setAlphaChannel
但它被弃用了。它指的是QPainter。我不知道QPainter是什么,我不确定我是朝着正确的方向前进。
请提出建议!
那么,问题是绘制机器人构建路线的正确有效方法是什么?
RobotPathItem(QGraphicsItem):
def __init__(self, path):
super().__init__()
qpath = []
for xy in path:
qpath.append(QPoint(xy[0],xy[1]))
self.path = QPolygon(qpath)
if path:
print(path[0])
def paint(self, painter, option, qwidget = None):
painter.drawPoints(self.path)
def boundingRect(self):
return QRectF(0,0,520,520)
答案 0 :(得分:2)
没有drawPixel,但是QPainter有一个drawPoint或drawPoints(在这种情况下,这会更有效率,我认为)。您需要创建一个包含您的点列表的自定义图形项,并遍历您的QPointF值列表并绘制它们。向列表中添加点时,请务必重新计算边界矩形。例如,如果你有一个RobotPathItem(派生自QGraphicsItem),你的paint方法可能类似于:
RobotPathItem::paint (QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
QPen pen;
// ... set up your pen color, etc., here
painter->setPen (pen);
painter->drawPoints (points, points.count ());
}
这假设"指向"是QPointF的QList或QVector。