python - 透明图像覆盖具有主窗口背景颜色的框架
问题描述
我正在尝试使用 PyQt 设计一个棋盘 GUI。该板由框架组成。当我放置棋子的透明 PNG 时,PNG 会与窗口的背景一起着色,从而覆盖下面的框架。当没有为窗口设置背景颜色时,该块及其下方的方块会正确显示。如何将图像设置为不使用窗口背景颜色覆盖其下方的框架方块?
from PyQt5 import QtWidgets
import PyQt5.QtWidgets as qtw
import PyQt5.QtGui as qtg
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
DIM = 1024
SQUARE = 70
PIECE = 60
class MainWindow(qtw.QWidget):
def __init__(self):
super().__init__()
self.setLayout(qtw.QGridLayout())
self.resize(DIM,DIM)
board = [[] for _ in range(0, 8)]
for r, row in enumerate(board):
for c in range(0, 8):
square = QFrame(self)
square.setObjectName(u"frame" + f"{r}-{c}")
square.setGeometry(QRect(DIM // 2 - SQUARE * (c - 4),
DIM - 300 - SQUARE*(r+1), SQUARE, SQUARE))
if (r + c) % 2 == 0:
square.setStyleSheet(u"background-color: grey;")
else:
square.setStyleSheet(u"background-color: white;")
board[r].append(square)
self.setStyleSheet("background-color: indigo;")
self.setWindowFlag(Qt.FramelessWindowHint)
pawn = QtWidgets.QLabel(self)
pawn.setPixmap(qtg.QPixmap("pieces/b_pawn.png"))
pawn.setGeometry(DIM // 2 - 2 * SQUARE + 5 , DIM - 300 - SQUARE + 5, PIECE, PIECE)
self.show()
app = qtw.QApplication([])
mw = MainWindow()
app.exec_()
mw.show()
解决方案
问题是您正在为顶级小部件设置一般背景,并且由于样式表被传播到子级,结果是该片段继承了该背景。
解决方案是始终避免此类通用声明并正确使用选择器。
在这种情况下,您可以使用类选择器:
class MainWindow(qtw.QWidget):
def __init__(self):
# ...
self.setStyleSheet("MainWindow {background-color: indigo;}")
不相关的考虑:
- 迭代一个在迭代本身中被修改的列表时要小心,并注意你没有正确地利用它:你已经有了内部列表,所以使用它
row.append(square)
; - 你正在创建一个布局,但你没有使用它;这可能会成为一个问题,因为调整主窗口的大小将不允许板子调整其大小或位置:如果窗口变大,板子将只占据界面的一部分,但如果尺寸更小,它可以变成完全看不见;请参阅此相关答案以获取在保持正确纵横比的同时考虑窗口大小调整的可能实现;
- 最后的
mw.show()
永远不会被调用(至少,没有用处),因为你在进入应用程序事件循环( )之后app.exec_()
放置了它;
推荐阅读
- openlayers - 地图和总览图可以拆分成两个html吗?
- r - 如何从 R 中的表中创建正确分段的列表?
- node.js - 什么是错误当使用 service worker 和 web-push 时,脚本在 vuejs 和 nodejs 中具有不受支持的 MIME 类型('text/html')
- node.js - RSA_padding_check_PKCS1_type_2:pkcs解码错误
- c# - 部分类型推断可能吗?
- spring - @Cacheable 创建的缓存的单独设置
- django - 如何查询和获取用户相关数据中的特定字段(多对多)
- css - 如何在Angular中将类样式从父级传递给子级,并在特定元素中使用它
- javascript - ADF-Oracle 在 id 中设置编号并且在 javascript 中找不到
- python - 在 sympy 中以十进制而不是精确值返回解决方案