python - 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)
但它对我没有用,它给出了非常难以理解的错误,不幸的是我已经丢失了。
解决方案
您必须使用的drawPixmap()
方法,但在它们之前,您必须使用如下所示的方法QPainter
缩放:QPixmap
scaled()
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
输出:
推荐阅读
- laravel - 使用 laravel 护照制作令牌并使用 axios 发送请求
- android - Xamarin 和 Android - 退出方法时崩溃
- java - 阵列适配器崩溃
- javascript - 带输入的 ReactJS 即时搜索
- python - Python 从正则表达式中替换第 n 个匹配项
- facebook-graph-api - Facebook 图形 API。如何删除视频?
- java - 如何在 UDF 中传递 Row?
- node.js - 使用 log4js 写入日志消息时添加动态值
- regex - 使用.htaccess 重定向正则表达式
- botframework - 在 bot builder v4 中下载 Skype bot 附件