2017-07-18 1 views
1

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.

Antwort

0

Ich landete mit this Methode und meine Schaltfläche Klassenwechsel zu:

class Button(QWidget): 
    clicked = pyqtSignal() 

    def __init__(self, text, w=75, h=50, parent=None): 
     super().__init__(parent) 
     layout = QVBoxLayout(self) 
     layout.setContentsMargins(QMargins(0, 0, 0, 0)) 
     self.setFixedSize(w + 5, h + 6) 
     self.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) 

     self.scene = QtWidgets.QGraphicsScene(self) 
     self.view = QtWidgets.QGraphicsView(self) 
     self.view.setScene(self.scene) 
     self._btn = QPushButton(text) 
     self._btn.setFixedSize(w, h) 
     self._btn.setAttribute(Qt.WA_TranslucentBackground) 
     self._btn.setStyleSheet(gui.css.button_css()) 
     self._btn.clicked.connect(self.click) 
     self.btn = self.scene.addWidget(self._btn) 
     self.enabled = True 

     layout.addWidget(self.view) 

    @property 
    def enabled(self): 
     return self._btn.isEnabled() 

    @enabled.setter 
    def enabled(self, state): 
     self._btn.setEnabled(state) 

     if state: 
      shadow = QGraphicsDropShadowEffect(self) 
      shadow.setOffset(1, 2) 
      shadow.setBlurRadius(4) 
      self.btn.setGraphicsEffect(shadow) 
     else: 
      self.btn.setGraphicsEffect(None) 

    def click(self): 
     self.clicked.emit() 
Verwandte Themen