首页 > 解决方案 > PyQt5中需要绘制图片替换矩形

问题描述

我正在 PyQt5 上写一个迷宫,它看起来像这样一个迷宫: 在此处输入图像描述

也就是说,墙壁、起点、终点和入口看起来只是彩色矩形。我有一个问题,我怎样才能把它们变成图像?

在这里,我得到了这些矩形的颜色。如何在同一个 drawImage 上更改此 drawRect 以绘制图片。

墙壁和地板

def draw_maze(self, drawer):
    for x in range(self.maze.width):
        for y in range(self.maze.height):
            if self.maze[x][y] == self.maze.WALL:
                drawer.setPen(Qt.white)
                drawer.setBrush(Qt.black)
                drawer.drawRect(x * self.maze.scale,
                                y * self.maze.scale,
                                self.maze.scale,
                                self.maze.scale)
            elif self.maze[x][y] == self.maze.EMPTY:
                drawer.setPen(QColor(200, 200, 200))
                drawer.setBrush(Qt.white)
                drawer.drawRect(x * self.maze.scale,
                                y * self.maze.scale,
                                self.maze.scale,
                                self.maze.scale)

开始和结束

def draw_start_and_finish(self, drawer):
    if self.maze.start:
        drawer.setPen(Qt.white)
        drawer.setBrush(Qt.green)
        drawer.drawRect(self.maze.start[0] * self.maze.scale,
                        self.maze.start[1] * self.maze.scale,
                        self.maze.scale,
                        self.maze.scale)
    if self.maze.finishes:
        drawer.setPen(Qt.white)
        drawer.setBrush(Qt.blue)
        for finish in self.maze.finishes:
            drawer.drawRect(finish[0] * self.maze.scale,
                            finish[1] * self.maze.scale,
                            self.maze.scale,
                            self.maze.scale)

门户网站

def draw_portals(self, drawer):
    colors = [QColor(0, 255, 255), QColor(255, 128, 0),
              QColor(255, 0, 128), QColor(0, 102, 0),
              QColor(0, 0, 102), QColor(153, 204, 255)]
    drawer.setPen(Qt.black)
    if self.portal1:
        drawer.setBrush(colors[len(self.maze.portals)])
        drawer.drawRect(self.portal1[0] * self.maze.scale,
                        self.portal1[1] * self.maze.scale,
                        self.maze.scale,
                        self.maze.scale)
    for i in range(len(self.maze.portals)):
        drawer.setBrush(colors[i])
        for portal in self.maze.portals[i]:
            drawer.drawRect(portal[0] * self.maze.scale,
                            portal[1] * self.maze.scale,
                            self.maze.scale,
                            self.maze.scale)

路径也用彩色矩形绘制。

def draw_path(self, drawer):
    if self.path:
        if self.draw_instantly:
            for point in self.path:
                if self.maze.is_wall(point[0], point[1]):
                    self.set_color(drawer, Qt.red)
                else:
                    self.set_color(drawer, Qt.yellow)
                drawer.drawRect(point[0] * self.maze.scale,
                                point[1] * self.maze.scale,
                                self.maze.scale,
                                self.maze.scale)
        else:
            for i in range(self.count):
                if self.maze.is_wall(self.path[i][0], self.path[i][1]):
                    self.set_color(drawer, Qt.red)
                else:
                    self.set_color(drawer, Qt.yellow)
                drawer.drawRect(self.path[i][0] * self.maze.scale,
                                self.path[i][1] * self.maze.scale,
                                self.maze.scale,
                                self.maze.scale)
            self.count += 1
            if self.count > len(self.path) - 1:
                self.count = len(self.path) - 1
        self.update()

获取颜色的方法:

@staticmethod
def set_color(drawer, color):
    drawer.setPen(Qt.black)
    drawer.setBrush(color)

很抱歉我无法附上所有代码,它非常大,并且分散在许多文件中。

Ps 几个小时后添加。

我提供的代码和我的一样:

import sys
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QPainter, QColor, QBrush


class MapEditor(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        self.setGeometry(300, 300, 350, 100)
        self.setWindowTitle('MapEditor')
        self.show()


    def paintEvent(self, e):
        drawer = QPainter()
        drawer.begin(self)
        self.drawRectangles(drawer)
        drawer.end()


    def drawRectangles(self, drawer):

        col = QColor(0, 0, 0)
        col.setNamedColor('#d4d4d4')
        drawer.setPen(col)

        drawer.setBrush(Qt.white)
        drawer.setBrush(QColor(200, 0, 0))
        drawer.drawRect(10, 15, 60, 60)


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = MapEditor()
    sys.exit(app.exec_())

我需要一个相同大小的图片而不是这个矩形。我只是不知道正确使用哪种方法。我尝试了各种方法,例如 DrawImage 或类似的方法:

    label = QLabel(self)
    pixmap = QPixmap(image_path)
    label.setPixmap(pixmap)

但它对我没有用,它给出了非常难以理解的错误,不幸的是我已经丢失了。

标签: pythonpython-3.xpyqtpyqt5

解决方案


您必须使用的drawPixmap()方法,但在它们之前,您必须使用如下所示的方法QPainter缩放:QPixmapscaled()

import sys
from PyQt5 import QtCore, QtGui, QtWidgets


class MapEditor(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setGeometry(300, 300, 350, 100)
        self.setWindowTitle('MapEditor')

    def paintEvent(self, e):
        drawer = QtGui.QPainter(self)
        drawer.setRenderHint(QtGui.QPainter.Antialiasing)

        r = QtCore.QRect(10, 15, 60, 60)

        image_path = "red.png"
        pixmap = QtGui.QPixmap(image_path)
        pixmap = pixmap.scaled(r.size())
        drawer.drawPixmap(r, pixmap)


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    ex = MapEditor()
    ex.show()
    sys.exit(app.exec_())

红色.png

在此处输入图像描述

输出:

在此处输入图像描述


推荐阅读