【问题标题】:Qt QGraphicsDropShadowEffect is not showingQt QGraphicsDropShadowEffect 未显示
【发布时间】:2012-12-09 09:17:51
【问题描述】:

我正在创建一个继承自 QWidget 的自定义小部件 my_widget

在这里,我有一个标签,我想应用QGraphicsDropShadowEffect,但它似乎不起作用,因为我没有看到任何阴影。

我的代码是用 Python 编写的,它是:

eff = QGraphicsDropShadowEffect()
self.my_widget_label.setGraphicsEffect(eff)

我尝试了对这段代码的各种修改,但无济于事。

在 Google 上进行了彻底搜索后,我遇到了许多类似的问题但没有答案。

可能是什么原因?如何获得阴影?

【问题讨论】:

    标签: python qt qt4 pyqt pyside


    【解决方案1】:

    在 C++ 中为我工作。我在包含名为titleLabelQLabel 对象的QDialog 中执行了以下操作。我在 Windows XP 计算机上使用 Qt 4.8.4。

    QGraphicsDropShadowEffect* eff = new QGraphicsDropShadowEffect(this);
    eff->setBlurRadius(5);
    titleLabel->setGraphicsEffect(eff);
    

    【讨论】:

    • 嗨@DanielHadberg。非常感谢您帮我检查。我目前在 Mac 上。也许那时可能是问题所在。再次感谢!
    • 希望您能找到可行的解决方案。它可能与Python有关吗?确保效果对象不会以某种方式被破坏。我认为它是在堆上分配的,所以它不应该。
    • 亲爱的@DanielHedberg,我试了又试,但放弃了。我正在创建第二个标签以提供某种“深度”。我认为这是 Qt 库的 Mac 或 Python 抽象问题。非常感谢!
    【解决方案2】:

    看看这是否适合你:

    #!/usr/bin/env python
    #-*- coding:utf-8 -*-
    
    import sip
    sip.setapi('QString', 2)
    sip.setapi('QVariant', 2)
    
    from PyQt4.QtCore import *
    from PyQt4.QtGui import *
    
    class testShadow(QWidget):
        def __init__(self, parent=None):
            super(testShadow, self).__init__(parent)
    
            self.resize(94, 35)
            self.verticalLayout = QVBoxLayout(self)
            self.verticalLayout.setObjectName("verticalLayout")
            self.label = QLabel(self)
            self.label.setText("Text Label")
    
            self.shadow = QGraphicsDropShadowEffect(self)
            self.shadow.setBlurRadius(5)
            self.label.setGraphicsEffect(self.shadow)
    
            self.verticalLayout.addWidget(self.label)
    
    if __name__ == "__main__":
        import  sys
    
        app = QApplication(sys.argv)
        main = testShadow()
        main.show()
        sys.exit(app.exec_())
    

    【讨论】:

    • 你好@X.Jacobs!不幸的是,它不起作用,并且像前面提到的@jdi 那样崩溃。我想我需要继承 QLabel 并使用它的paintEvent 来绘制具有阴影效果的标签。你能帮我解决这个问题吗?我过去一个小时一直在尝试这样做,但我不确定如何重新实现 QLabel 的整个paintEvent 来绘制标签本身。谢谢!
    • 您可以随时查看 Qt 源代码以获取灵感。
    • @X.Jacobs,当然,我确实运行了代码。我不想浪费任何人的时间。我在 Mac 上使用 PySide。这是行不通的。我收到以下错误: QPainter::begin: 小部件绘画只能作为paintEvent QPainter::translate: Painter not active Segmentation fault: 11的结果开始
    【解决方案3】:

    我只在QGraphicsScene 情况下尝试过使用它(并成功使用它)。这对我有用,而尝试将其设置为普通的 QWidget 实际上会使整个应用程序崩溃:

    from PyQt4 import QtGui
    
    class Graphics(QtGui.QWidget):
        def __init__(self):
            super(Graphics, self).__init__()
    
            layout = QtGui.QVBoxLayout(self)
            layout.setMargin(0)
    
            shad = QtGui.QGraphicsDropShadowEffect(self)
            shad.setBlurRadius(5)
    
            self.scene = QtGui.QGraphicsScene(self)
            self.view = QtGui.QGraphicsView(self)
            self.view.setScene(self.scene)
            text = self.scene.addText("Drop Shadow!")
            text.setGraphicsEffect(shad)
    
            layout.addWidget(self.view)
    
    if __name__ == "__main__":
        app = QtGui.QApplication([])
        main = Graphics()
        main.show()
        main.raise_()
        app.exec_()
    

    【讨论】:

    • 我错过了“setGraphicsEffect”调用。谢谢!
    猜你喜欢
    • 2013-05-05
    • 2020-01-16
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多