您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

python3+PyQt5实现柱状图

2024/2/17 17:22:59发布26次查看
这篇文章主要为大家详细介绍了python3+pyqt5实现柱状图的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文通过python3+pyqt5实现了python qt gui 快速编程的16章的excise例子。
#!/usr/bin/env python3 import random import sys from pyqt5.qtcore import (qabstractlistmodel, qabstracttablemodel, qmodelindex, qsize, qtimer, qvariant, qt,pyqtsignal) from pyqt5.qtwidgets import (qapplication, qdialog, qhboxlayout, qlistview, qspinbox, qstyleditemdelegate,qstyleoptionviewitem, qwidget) from pyqt5.qtgui import qcolor,qpainter,qpixmap class bargraphmodel(qabstractlistmodel): datachanged=pyqtsignal(qmodelindex,qmodelindex) def __init__(self): super(bargraphmodel, self).__init__() self.__data = [] self.__colors = {} self.minvalue = 0 self.maxvalue = 0 def rowcount(self, index=qmodelindex()): return len(self.__data) def insertrows(self, row, count): extra = row + count if extra >= len(self.__data): self.begininsertrows(qmodelindex(), row, row + count - 1) self.__data.extend([0] * (extra - len(self.__data) + 1)) self.endinsertrows() return true return false def flags(self, index): #return (qabstracttablemodel.flags(self, index)|qt.itemiseditable) return (qabstractlistmodel.flags(self, index)|qt.itemiseditable) def setdata(self, index, value, role=qt.displayrole): row = index.row() if not index.isvalid() or 0 > row >= len(self.__data): return false changed = false if role == qt.displayrole: value = value self.__data[row] = value if self.minvalue > value: self.minvalue = value if self.maxvalue < value: self.maxvalue = value changed = true elif role == qt.userrole: self.__colors[row] = value #self.emit(signal("datachanged(qmodelindex,qmodelindex)"), # index, index) self.datachanged[qmodelindex,qmodelindex].emit(index, index) changed = true if changed: #self.emit(signal("datachanged(qmodelindex,qmodelindex)"), # index, index) self.datachanged[qmodelindex,qmodelindex].emit(index, index) return changed def data(self, index, role=qt.displayrole): row = index.row() if not index.isvalid() or 0 > row >= len(self.__data): return qvariant() if role == qt.displayrole: return self.__data[row] if role == qt.userrole: return qvariant(self.__colors.get(row, qcolor(qt.red))) if role == qt.decorationrole: color = qcolor(self.__colors.get(row, qcolor(qt.red))) pixmap = qpixmap(20, 20) pixmap.fill(color) return qvariant(pixmap) return qvariant() class bargraphdelegate(qstyleditemdelegate): def __init__(self, minimum=0, maximum=100, parent=none): super(bargraphdelegate, self).__init__(parent) self.minimum = minimum self.maximum = maximum def paint(self, painter, option, index): myoption = qstyleoptionviewitem(option) myoption.displayalignment |= (qt.alignright|qt.alignvcenter) qstyleditemdelegate.paint(self, painter, myoption, index) def createeditor(self, parent, option, index): spinbox = qspinbox(parent) spinbox.setrange(self.minimum, self.maximum) spinbox.setalignment(qt.alignright|qt.alignvcenter) return spinbox def seteditordata(self, editor, index): value = index.model().data(index, qt.displayrole) editor.setvalue(value) def setmodeldata(self, editor, model, index): editor.interprettext() model.setdata(index, editor.value()) class bargraphview(qwidget): width = 20 def __init__(self, parent=none): super(bargraphview, self).__init__(parent) self.model = none def setmodel(self, model): self.model = model #self.connect(self.model, # signal("datachanged(qmodelindex,qmodelindex)"), # self.update) self.model.datachanged[qmodelindex,qmodelindex].connect(self.update) #self.connect(self.model, signal("modelreset()"), self.update) self.model.modelreset.connect(self.update) def sizehint(self): return self.minimumsizehint() def minimumsizehint(self): if self.model is none: return qsize(bargraphview.width * 10, 100) return qsize(bargraphview.width * self.model.rowcount(), 100) def paintevent(self, event): if self.model is none: return painter = qpainter(self) painter.setrenderhint(qpainter.antialiasing) span = self.model.maxvalue - self.model.minvalue painter.setwindow(0, 0, bargraphview.width * self.model.rowcount(), span) for row in range(self.model.rowcount()): x = row * bargraphview.width index = self.model.index(row) color = qcolor(self.model.data(index, qt.userrole)) y = self.model.data(index) painter.fillrect(x, span - y, bargraphview.width, y, color) class mainform(qdialog): def __init__(self, parent=none): super(mainform, self).__init__(parent) self.model = bargraphmodel() self.bargraphview = bargraphview() self.bargraphview.setmodel(self.model) self.listview = qlistview() self.listview.setmodel(self.model) self.listview.setitemdelegate(bargraphdelegate(0, 1000, self)) self.listview.setmaximumwidth(100) self.listview.setedittriggers(qlistview.doubleclicked| qlistview.editkeypressed) layout = qhboxlayout() layout.addwidget(self.listview) layout.addwidget(self.bargraphview, 1) self.setlayout(layout) self.setwindowtitle("bar grapher") qtimer.singleshot(0, self.initialload) def initialload(self): # generate fake data count = 20 self.model.insertrows(0, count - 1) for row in range(count): value = random.randint(1, 150) color = qcolor(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) index = self.model.index(row) self.model.setdata(index, value) self.model.setdata(index, qvariant(color), qt.userrole) app = qapplication(sys.argv) form = mainform() form.resize(600, 400) form.show() app.exec_()
运行结果:
相关推荐:
python3+pyqt5实现文档打印功能
以上就是python3+pyqt5实现柱状图的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product