python - 在 PyQt 中绘制具有高度和降低效果的 3D 矩形/多边形
问题描述
在 Java 中,您可以使用(参见https://way2java.com/awt-graphics/4891/)绘制 3-d 矩形:
void fill3DRect(int x, int y, int width, int height, boolean raised)
这里,最后一个参数“raised”用于相对于绘图表面降低/提升 3d 矩形。
如何在 PyQt 中实现这种效果?
解决方案
这取决于您要使用的油漆级别:
有2个选项:
- 使用 QPainter:
这种效果可以通过绘制 2 个位移的矩形来实现,其中背景矩形的颜色比前面的颜色深:
from PyQt5 import QtCore, QtGui, QtWidgets
def draw3DRect(painter, rect, color, raised=False, offset=QtCore.QPoint(4, 4)):
if raised:
painter.fillRect(rect.translated(offset), color.darker())
painter.fillRect(rect, color)
class Widget(QtWidgets.QWidget):
def paintEvent(self, event):
painter = QtGui.QPainter(self)
r = QtCore.QRect(
self.width() / 4,
self.height() / 4,
self.width() / 2,
self.height() / 2,
)
draw3DRect(painter, r, QtGui.QColor("green"), raised=True)
def sizeHint(self):
return QtCore.QSize(320, 240)
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = Widget()
w.show()
sys.exit(app.exec_())
- 使用 QGraphicsDropShadowEffect:
在这种情况下,QWidget 和 QGraphicsItem 支持这种效果:
from PyQt5 import QtCore, QtGui, QtWidgets
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = QtWidgets.QWidget()
lay = QtWidgets.QHBoxLayout(w)
scene = QtWidgets.QGraphicsScene()
view = QtWidgets.QGraphicsView(scene)
rect_item = QtWidgets.QGraphicsRectItem(QtCore.QRectF(0, 0, 200, 100))
rect_item.setBrush(QtGui.QColor("green"))
effect_item = QtWidgets.QGraphicsDropShadowEffect(
offset=QtCore.QPointF(3, 3), blurRadius=5
)
rect_item.setGraphicsEffect(effect_item)
scene.addItem(rect_item)
rect_widget = QtWidgets.QWidget()
rect_widget.setFixedSize(320, 240)
rect_widget.setStyleSheet("background-color:green;")
effect_widget = QtWidgets.QGraphicsDropShadowEffect(
offset=QtCore.QPointF(3, 3), blurRadius=5
)
rect_widget.setGraphicsEffect(effect_widget)
lay.addWidget(view)
lay.addWidget(rect_widget)
w.resize(640, 480)
w.show()
sys.exit(app.exec_())
推荐阅读
- typescript - @babel/plugin-transform-typescript 不支持 `import =`
- python - 在另一个浏览器页面上打开时如何在python中使用selenium自动下载PDF文件
- prolog - 我已经定义了多个似乎共享一个共同形式的谓词
- sql - 从一张表中计算多个时间戳的总计
- python - Tkinter 在 docker 中安装
- ios - Xcode 12 应用内购买仅以美元显示
- javascript - 如何创建元素 JavaScript BASIC
- python - Geoviews 绘图显示不正确的经度和纬度/以错误的格式显示它们
- mysql - MYSQL:仅根据 ID 分组在第一行添加一些数据
- xcode - Instagram 教程 SwiftUI Firebase 未加载时间轴