如何在 Qt 中将 QGraphicsEffect 添加到 QAbstractItemView?

Posted

技术标签:

【中文标题】如何在 Qt 中将 QGraphicsEffect 添加到 QAbstractItemView?【英文标题】:How to add a QGraphicsEffect to a QAbstractItemView in Qt? 【发布时间】:2020-08-23 04:03:58 【问题描述】:

我正在尝试在 Qt(在 Python 2.7 中使用 PySide2,但应该适用于任何带有 Qt 的语言)。

我怀疑由于项目视图小部件使用渲染委托等按项目呈现自身的方式,它们不会很好地发挥作用并且没有解决方案。我找不到对它的引用,它在文档中明确不起作用,所以它似乎应该起作用(我的意思是,它们是 QWidget 的子类,它确实支持 QGraphicsEffects。似乎在实施中可能存在疏忽/文档)。任何人都可以确认或帮助解决此问题的正确方法或解决方法吗?

使用模糊效果演示的示例:

from PySide2 import QtWidgets, QtGui, QtCore

lw = QtWidgets.QListWidget()
lw.addItems(["dog", "cat", "fish", "platypus"])
lw.show()

ge = QtWidgets.QGraphicsBlurEffect()
lw.setGraphicsEffect(ge)
ge.setBlurRadius(20)

btn = QtWidgets.QPushButton("so fuzzy!")
btn.show()

ge = QtWidgets.QGraphicsBlurEffect()
btn.setGraphicsEffect(ge)
ge.setBlurRadius(20)

截图:

【问题讨论】:

可能是这样的:bugreports.qt.io/plugins/servlet/mobile#issue/QTBUG-70815 【参考方案1】:

您必须对视口应用效果:

from PySide2 import QtWidgets

app = QtWidgets.QApplication()

lw = QtWidgets.QListWidget()
lw.addItems(["dog", "cat", "fish", "platypus"])
lw.show()

ge = QtWidgets.QGraphicsBlurEffect()
lw.viewport().setGraphicsEffect(ge)
ge.setBlurRadius(20)

btn = QtWidgets.QPushButton("so fuzzy!")
btn.show()

ge2 = QtWidgets.QGraphicsBlurEffect()
btn.setGraphicsEffect(ge2)
ge2.setBlurRadius(20)

app.exec_()

【讨论】:

啊哈!这样做。没想到将QAbstractScrollArea 作为问题的一部分。我现在看到,我提出问题的方式可能是错误的,因为我正在寻求通过将效果应用于所有小部件的父级来将效果应用于许多小部件。这适用于没有视口的小部件,但在项目视图中,当您突出显示它们重绘而没有效果的项目时,但导致所有小部件重绘(调整大小、显示等)的更改会使它们绘制模糊。有没有办法解决这个问题? @MitchellKehn 如果您还有其他问题,那么您必须创建另一个帖子,这些是 SO 规则

以上是关于如何在 Qt 中将 QGraphicsEffect 添加到 QAbstractItemView?的主要内容,如果未能解决你的问题,请参考以下文章

QGraphicsEffect介绍(十分漂亮)

如何使 Qt 小部件淡入或淡出?

从子小部件中删除 QGraphicsEffect [重复]

如何在 Qt 中将项目添加到布局中?

如何在 Qt 中将消息从子窗口小部件发送到父窗口?

如何在 Qt 中将 foreach 与 QDomNodeList 一起使用?