首页 > 解决方案 > 在 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 中实现这种效果?

标签: python3dpyqt

解决方案


这取决于您要使用的油漆级别:

有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_())

在此处输入图像描述


推荐阅读