在窗口中放置一个QWidget,用于画图(使用QPainter),其余位置可以放置别的控件。
二、自定义QWidget类自定义一个QWidget类,编写绘制的函数
class Drawing(QWidget):
def __init__(self, parent=None):
super(Drawing, self).__init__(parent)
self.setWindowTitle("QPainter测试")
self.setMinimumSize(600, 200)
# self.setMaximumSize(700, 700)
# self._title = '预计可用 年'
def drawTitle(self, painter):
...
def drawColorPie(self, painter):
...
def drawPointerIndicator(self, painter):
...
def drawLine(self, painter):
...
...
...
三、重写paintEvent
进行坐标变换后可以开始调用painter画笔进行绘画:painter.begin()
def paintEvent(self, event):
# 坐标轴变换 默认640*480
width = self.width()
height = self.height()
painter = QPainter(self) # 初始化painter
painter.translate(width / 2, height / 2) # 坐标轴变换,调用translate()将坐标原点平移至窗口中心
# 坐标刻度自适应
side = min(width, height)
painter.scale(side / 200.0, side / 200.0) # 本项目中将坐标缩小为side/200倍,即画出length=10的直线,其实际长度应为10*(side/200)。
# 启用反锯齿,使画出的曲线更平滑
painter.setRenderHints(QPainter.Antialiasing | QPainter.TextAntialiasing)
painter.begin(self)
# 调用编写过的函数进行paint操作
self.drawColorPie(painter)
self.drawPointerIndicator(painter)
self.drawText(painter)
self.drawTitle(painter)
...
...
四、在窗口中使用
1、导入自定义类
在需要显示该Widget的主窗口中导入自定义的类:from test.dashboardTest import Drawing
2、添加自定义类声明类,并且设置其在主窗口中的布局位置等信息。
self.simulationView = Drawing()
sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.simulationView.sizePolicy().hasHeightForWidth())
self.simulationView.setSizePolicy(sizePolicy)
self.simulationView.setObjectName("simulationView")
self.gridLayout_chart.addWidget(self.simulationView, 0, 2, 1, 1)
# self.simulationView.setVisible(False)
3、运行主窗口
运行主窗口后就可以看到QWidget和其他控件一起的效果
if __name__ == "__main__":
app = QApplication(sys.argv)
view = MainWindow()
# ChildWindow = ChildWin()
view.show()
sys.exit(app.exec_())
将QWidget与主窗口分离的好处是可以单独控制每个控件的显示状态,不互相耦合。通过self.simulationView.setVisible(False)设置该部分的是否可见。这样就可以结合按钮,改变主窗口的显示内容。
五、仪表盘制作【Python】PyQt5 使用QPainter绘制简易仪表盘
参考:
https://blog.csdn.net/asszpdhpg/article/details/99301109?spm=1001.2014.3001.5501
https://www.cnblogs.com/wangmantou/p/11662779.html



