【发布时间】:2017-12-23 15:18:32
【问题描述】:
我正在使用 QFrame 使用 QGraphicsDropShadowEffect 制作带有阴影的“卡片”。我遇到的问题是,如果我在卡片上添加一个按钮,然后在按钮上添加一个阴影,该按钮是不可见的,但仍然可以点击。如果我从卡片上删除阴影,它会很好地显示按钮,或者如果我从按钮上删除阴影,它是可见的。看来我不能在卡片和按钮上都有阴影。
我的课:
class Card(QFrame):
""" """
def __init__(self, title='Card Title', cls_layout=QVBoxLayout,
vsizing=QSizePolicy.Preferred, hsizing=QSizePolicy.Preferred,
has_shadow=False, subtitle='', parent=None):
super().__init__(parent)
self.has_shadow = has_shadow
self.setStyleSheet('QFrame { border-radius: 2px; background: white;}')
self._layout = QVBoxLayout(self)
self._layout.setAlignment(Qt.AlignTop)
self._lblTitle = QLabel(title)
self._lblTitle.setFont(make_font(pt=12, b=True))
self._lblSubtitle = QLabel()
self._lblSubtitle.setIndent(4)
self._layout.addWidget(self._lblTitle)
self._layout.addWidget(self._lblSubtitle)
self._layout.addSpacing(4)
#self.subtitle = subtitle # property not used for example
self.enabled = True
self.layout = cls_layout() # where content is added
self._layout.addLayout(self.layout)
self.setSizePolicy(hsizing, vsizing)
@property
def enabled(self):
return self.isEnabled()
@enabled.setter
def enabled(self, state):
if state and self.has_shadow:
effect = QGraphicsDropShadowEffect(self)
effect.setOffset(1, 2)
effect.setBlurRadius(4)
self.setGraphicsEffect(effect)
else:
self.setGraphicsEffect(None)
self.setEnabled(state)
class PushButton(QPushButton):
def __init__(self, text, width=75, height=30, parent=None):
super().__init__(text, parent)
self.setFixedWidth(width)
self.setFixedHeight(height)
self.enabled = True
@property
def enabled(self):
return self.isEnabled()
@enabled.setter
def enabled(self, state):
self.setGraphicsEffect(None)
if state:
self.effect = QGraphicsDropShadowEffect(self)
self.effect.setOffset(1, 2)
self.effect.setBlurRadius(4)
self.setGraphicsEffect(self.effect)
self.setEnabled(state)
这是我如何使用它们的示例:
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout
import sys
if __name__ == '__main__':
app = QApplication([])
window = QMainWindow()
widget = QWidget()
layout = QVBoxLayout(widget)
window.setCentralWidget(widget)
card = Card(has_shadow=True)
btn = PushButton('Test Button')
btn.clicked.connect(print)
card.layout.addWidget(btn)
btn.enabled = False # Button Visible
# btn.enabled = True # Button Invisible, but still click-able
layout.addWidget(card)
window.show()
sys.exit(app.exec_())
我尝试放弃卡上的投影并将 QFrame 设置为带有凸起阴影的 StyledPanel,但我无法让它们显示出来,即使我从中删除了 css。如果有区别,我正在使用带有 Anaconda 4.4 的 Windows 7。我假设我要么使用了错误的图形效果,要么做错了其他事情,但我无法找到任何其他有类似问题的帖子。
【问题讨论】:
标签: python python-3.x pyqt qt5 pyqt5