Ich benutze QFrame, um mit QGraphicsDropShadowEffect 'Karten' mit Schlagschatten zu erstellen. Das Problem, das ich habe, ist, wenn ich der Karte einen Knopf hinzufüge, dann einen Schlagschatten zum Knopf hinzufüge, der Knopf ist unsichtbar, aber noch klickbar. Wenn ich den Schlagschatten von der Karte entferne, zeigt er den Knopf an, oder wenn ich den Schatten von der Taste entferne, ist er sichtbar. Es scheint, ich kann keine Schlagschatten sowohl auf der Karte als auch auf dem Knopf haben.QPushButton wird beim Hinzufügen des QGraphicsDropShadow-Effekts unsichtbar, wenn das Eltern-Widget auch einen Effekt hat
Meine Klassen:
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)
Dies ist ein Beispiel dafür, wie ich sie bin mit:
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_())
ich auf der Karte die Schlagschatten versuchte Notwasserung und die QFrame zu StyledPanel Einstellung mit Raised Schatten, aber ich kann sie nicht auftauchen sehen, selbst wenn ich das CSS daraus entferne. Ich benutze Windows 7 mit Anaconda 4.4, wenn das einen Unterschied macht. Ich gehe davon aus, dass ich entweder den Grafikeffekt falsch verwende oder etwas falsch mache, aber ich konnte keine anderen Beiträge mit einem ähnlichen Problem finden.