2017-07-18 15 views
1

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を使用しています。私は間違ってグラフィックスの効果を使用しているか、何か他のことをやっていると仮定していますが、同様の問題を持つ他の投稿を見つけることができませんでした。

答えて

0

私はthisメソッドを使用して終了とする私のボタンクラスを変更:

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() 
関連する問題