Python 在PyQt中绘制具有提升和降低效果的三维矩形/多边形

Python 在PyQt中绘制具有提升和降低效果的三维矩形/多边形,python,3d,pyqt,Python,3d,Pyqt,在Java中,可以使用绘制三维矩形(请参见): 这里,最后一个参数“凸起”用于相对于绘图表面降低/升高三维矩形 如何在PyQt中实现此效果?据我所知,PyQt没有内置的3D绘制小部件/功能,因为您只能绘制2D多边形。但是我们可以创建一个自定义类来模拟3D绘画。从您的Java链接: Java支持3D矩形,但三维效果不是很明显。由于海拔较低,影响可忽略不计Java设计人员通过沿矩形边框绘制较亮和较暗的线条来实现3D效果。 我们可以模拟Java的3D绘制功能的效果: void fill3DRect(i

在Java中,可以使用绘制三维矩形(请参见):

这里,最后一个参数“凸起”用于相对于绘图表面降低/升高三维矩形


如何在PyQt中实现此效果?

据我所知,PyQt没有内置的3D绘制小部件/功能,因为您只能绘制2D多边形。但是我们可以创建一个自定义类来模拟3D绘画。从您的Java链接:

Java支持3D矩形,但三维效果不是很明显。由于海拔较低,影响可忽略不计Java设计人员通过沿矩形边框绘制较亮和较暗的线条来实现3D效果。

我们可以模拟Java的3D绘制功能的效果:

void fill3DRect(int x, int y, int width, int height, boolean raised)
此方法使用上述指定参数绘制实心三维矩形。最后一个布尔参数true表示图形表面上方的高程,false表示表面蚀刻

为了在Python中获得3D效果,我们基本上可以做同样的事情,先使用两种颜色的阴影,然后对某些面进行变暗和照明


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

有两种选择:

  • 使用QPainter:
此效果可通过绘制2个置换矩形来实现,其中背景矩形的颜色比前面的颜色深:

从PyQt5导入QtCore、QtGui、qtwidget
def draw3DRect(画师、矩形、颜色、凸起=假、偏移=QtCore.QPoint(4,4)):
如果提出:
painter.fillRect(rect.translated(offset),color.darker())
painter.fillRect(矩形,颜色)
类小部件(qtwidts.QWidget):
def paintEvent(自身,事件):
painter=QtGui.QPainter(自)
r=QtCore.QRect(
self.width()/4,
self.height()/4,
self.width()/2,
self.height()/2,
)
draw3DRect(画师,r,QtGui.QColor(“绿色”),凸起=真)
def sizeHint(自身):
返回QtCore.QSize(320240)
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
w=Widget()
w、 show()
sys.exit(app.exec_())

  • 使用QGraphicsDropShadowEffect:
在这种情况下,QWidget和QGraphicsItem支持这种效果:

从PyQt5导入QtCore、QtGui、qtwidget
如果名称=“\uuuuu main\uuuuuuuu”:
导入系统
app=qtwidts.QApplication(sys.argv)
w=qtwidts.QWidget()
lay=qtwidts.QHBoxLayout(w)
scene=qtwidts.qgraphicscene()
view=QtWidgets.QGraphicsView(场景)
rect_item=qtwidts.qgraphicsrecitem(QtCore.QRectF(0,0,200,100))
矩形项目立根(QtGui.QColor(“绿色”))
effect_item=qtwidts.QGraphicsDropShadowEffect(
偏移量=QtCore.QPointF(3,3),模糊半径=5
)
rect_项目。setGraphicsEffect(效果项目)
场景.附加项(矩形项)
rect_widget=qtwidts.QWidget()
rect_widget.setFixedSize(320240)
rect_widget.setStyleSheet(“背景色:绿色;”)
effect_widget=qtwidts.QGraphicsDropShadowEffect(
偏移量=QtCore.QPointF(3,3),模糊半径=5
)
rect_widget.setGraphicsEffect(effect_widget)
lay.addWidget(视图)
lay.addWidget(rect_小部件)
w、 调整大小(640480)
w、 show()
sys.exit(app.exec_())

void fill3DRect(int x, int y, int width, int height, boolean raised)
from PyQt5 import QtCore, QtGui, QtWidgets
import sys

class Rectangle3D(QtWidgets.QWidget):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)

        # Elevated 3D rectangle color settings
        self.elevated_border_color = QtGui.QColor(111,211,111)
        self.elevated_fill_color = QtGui.QColor(0,255,0)
        self.elevated_pen_width = 2.5

        # Lowered 3D rectangle color settings
        self.lowered_border_color = QtGui.QColor(0,235,0)
        self.lowered_fill_color = QtGui.QColor(0,178,0)
        self.lowered_pen_width = 2.5

    def draw3DRectangle(self, x, y, w, h, raised=True):
        # Specify the border/fill colors depending on raised or lowered
        if raised:
            # Line color (border)
            self.pen = QtGui.QPen(self.elevated_border_color, self.elevated_pen_width)
            # Fill color
            self.fill = QtGui.QBrush(self.elevated_fill_color)
        else:
            # Line color (border)
            self.pen = QtGui.QPen(self.lowered_border_color, self.lowered_pen_width)
            # Fill color
            self.fill = QtGui.QBrush(self.lowered_fill_color)

        painter = QtGui.QPainter(self)

        # Draw border color of rectangle
        painter.setPen(self.pen)
        painter.setBrush(self.fill)  
        painter.drawRect(x, y, w, h)

        # Cover up the top and left sides with filled color using lines
        if raised:
            painter.setPen(QtGui.QPen(self.elevated_fill_color, self.elevated_pen_width))
        else:
            painter.setPen(QtGui.QPen(self.lowered_fill_color, self.lowered_pen_width))

        painter.drawLine(x, y, x + w, y) 
        painter.drawLine(x, y, x, y + h)

    def paintEvent(self, event):
        self.draw3DRectangle(50,50,300,150,True)
        self.draw3DRectangle(50,250,300,150,False)

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv) 

    widget = Rectangle3D()
    widget.show()

    sys.exit(app.exec_())