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