QT5 QgraphicsScene:如何逐像素地绘制地面

时间:2017-02-03 17:26:29

标签: python qt pyqt

我正在使用PyQt5。我正在制作一个机器人在迷宫中移动的程序。 为此,我使用QGraphicsScene。我添加像QRect这样的对象来代表机器人。背景通过SetBackgroundBrush设置并从png图像加载(黑色表示不可通过的地形): this is how it looks

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)

1 个答案:

答案 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。