QFrameを使用してQGraphicsDropShadowEffectを使用してドロップシャドーで「カード」を作成しています。私が持っている問題は、カードにボタンを追加し、ドロップシャドウをボタンに追加すると、ボタンは見えなくなりますが、それでもクリック可能です。カードからドロップシャドウを取り除くと、ボタンがきれいに表示されます。または、シャドウをボタンから削除すると、そのボタンが表示されます。カードとボタンの両方に影を落とすことはできないようです。QGraphicsDropShadowエフェクトを追加したときにQPushButtonが表示されなくなりました。
私のクラス:
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_())
私を上げると、カードにドロップシャドウを捨てるとStyledPanelにQFrameを設定してみましたシャドウですが、たとえ私がそれからCSSを削除しても、それらを表示することはできません。私は違いがある場合、アナコンダ4.4でWindows 7を使用しています。私は間違ってグラフィックスの効果を使用しているか、何か他のことをやっていると仮定していますが、同様の問題を持つ他の投稿を見つけることができませんでした。