python3+PyQt5实现柱状图

 更新时间:2018年04月24日 09:25:31   作者:basisworker   我要评论
这篇文章主要为大家详细介绍了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_()

运行结果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持澳门金沙网上娱乐。

相关文章

  • Python实现pdf文档转txt的方法示例

    Python实现pdf文档转txt的方法示例

    这篇文章主要介绍了Python实现pdf文档转txt的方法,结合实例形式分析了Python基于第三方库pdfminier实现针对pdf格式文档的读取、转换等相关操作技巧,需要的朋友可以参考下
    2018-01-01
  • 在pytorch中为Module和Tensor指定GPU的例子

    在pytorch中为Module和Tensor指定GPU的例子

    今天小编就为大家分享一篇在pytorch中为Module和Tensor指定GPU的例子,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • Python实现生成简单的Makefile文件代码示例

    Python实现生成简单的Makefile文件代码示例

    这篇文章主要介绍了Python实现生成简单的Makefile文件代码示例,本文给出了两段实现代码,需要的朋友可以参考下
    2015-03-03
  • Python标准库sched模块使用指南

    Python标准库sched模块使用指南

    这篇文章主要介绍了Python标准库sched模块使用的相关资料,需要的朋友可以参考下
    2017-07-07
  • django中ORM模型常用的字段的使用方法

    django中ORM模型常用的字段的使用方法

    这篇文章主要介绍了django中ORM模型常用的字段的使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • Python面向对象思想与应用入门教程【类与对象】

    Python面向对象思想与应用入门教程【类与对象】

    这篇文章主要介绍了Python面向对象思想与应用,较为详细的分析了Python面向对象思想与原理,并结合实例形式分析了类与对象相关定义、用法及操作注意事项,需要的朋友可以参考下
    2019-04-04
  • Python中最好用的命令行参数解析工具(argparse)

    Python中最好用的命令行参数解析工具(argparse)

    这篇文章主要介绍了Python中最好用的命令行参数解析工具(argparse),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • APIStar:一个专为Python3设计的API框架

    APIStar:一个专为Python3设计的API框架

    今天小编就为大家分享一篇关于一个专为Python3设计的API框架:APIStar,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-09-09
  • springboot配置文件抽离 git管理统 配置中心详解

    springboot配置文件抽离 git管理统 配置中心详解

    在本篇文章里小编给大家整理的是关于springboot配置文件抽离 git管理统 配置中心的相关知识点内容,有需要的朋友们可以学习下。
    2019-09-09
  • Python 200行代码实现一个滑动验证码过程详解

    Python 200行代码实现一个滑动验证码过程详解

    这篇文章主要介绍了Python 200行代码实现一个滑动验证码过程详解,各种各样的验证码,比较高级的有滑动、点选等样式,看起来好像挺复杂的,但实际上它们的核心原理还是还是很清晰的,本文章大致说明下这些验证码的原理以及带大家实现一个滑动验证码
    2019-07-07

最新评论