【问题标题】:QPushButton becomes invisible when adding QGraphicsDropShadow effect if parent widget has an effect also如果父小部件也有效果,则在添加 QGraphicsDropShadow 效果时 QPushButton 变得不可见
【发布时间】: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


    【解决方案1】:

    我最终使用了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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      相关资源
      最近更新 更多