这篇文章主要为大家详细介绍了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实现柱状图_python3+PyQt5实现柱状图相关推荐

  1. python使用matplotlib可视化堆叠的柱状图(stacked bar plot)、多个类别的数据在分类变量层面累积堆叠起来

    python使用matplotlib可视化堆叠的柱状图(stacked bar plot).多个类别的数据在分类变量层面累积堆叠起来 目录

  2. Python使用matplotlib绘制分组对比柱状图(bar plot)可视化时汉语(中文)标签显示成了框框□□、什么情况、我们有解决方案

    Python使用matplotlib绘制分组对比柱状图可视化时(bar plot)汉语(中文)标签显示成了框框□□.什么情况.我们有解决方案 目录

  3. python 画柱状图-python使用Plotly绘图工具绘制柱状图

    本文实例为大家分享了python使用Plotly绘图工具绘制柱状图的具体代码,供大家参考,具体内容如下 使用Plotly绘制基本的柱状图,需要用到的函数是graph_objs 中 Bar函数 通过参数 ...

  4. #18 可视化基础4-簇形柱状图、百分比堆积柱状图、并列子图

    目录 簇形柱状图 「不指定x轴和y轴数据」 plot.bar() 「不指定x轴和y轴数据」 plot.bar("指定为x轴的columns",["指定为y轴的column ...

  5. Python 图形界面框架 PyQt5 使用指南!

    作者:钱魏Way https://www.biaodianfu.com/pyqt5.html 使用Python开发图形界面的软件其实并不多,相对于GUI界面,可能Web方式的应用更受人欢迎.但对于像我 ...

  6. python的GUI库PyQt5的使用

    python的GUI库PyQt5的使用(12-20190222) 文章目录: 一.PyQt5介绍 二.PyQt5使用介绍 3.Qt Designer的介绍 [参考](https://www.jians ...

  7. python之pyqt5-第一个pyqt5程序-图像压缩工具(2.0版本)-小记

    python之pyqt5-第一个pyqt5程序-图像压缩工具(2.0版本)-小记 此篇为上一篇pyqt5图像压缩小工具改良版.因为比较简单,下面直接贴上代码. 效果图: # -*- coding: u ...

  8. python(matplotlib4)——Scatter 散点图,Bar柱状图(方向:向上,向下),柱状图添加注释

    文章目录 前言 scatter 散点图 Bar柱状图(方向:向上,向下) 前言 来自 莫烦python的总结. scatter 散点图 n =500 X = np.random.normal(0,1, ...

  9. Python:Matplotlib 画曲线和柱状图(Code)

    原文链接:http://blog.csdn.net/ikerpeng/article/details/20523679 参考资料:http://matplotlib.org/gallery.html ...

最新文章

  1. 关于yum的/repodata/repomd.xml错误
  2. linux nobody 用户,Linux CentOS7安装配置tomcat8(使用非root用户/nobody用户运行)
  3. 全面讲解Python列表数组(二),列表分区/片,列表操作符,比较操作符,逻辑操作符,连接操作符,重复操作符,成员关系操作符;
  4. jane street information session on pythonandocaml
  5. 王者荣耀在线服务器,王者荣耀实时对战服务器Photon之PUN介绍
  6. PHP通过PDO连接Microsoft Access数据库
  7. 利用 VBA 和 HTML自制兼容 WPS及 EXCEL(32位/64位)的颜色选择器
  8. 关于srand((unsigned)time(NULL))是初始化随机函数种子
  9. 华为ac控制器web配置手册_AC+AP组建无线网络,解决路由器没地方放,不美观
  10. Luogu4494 [HAOI2018]反色游戏 【割顶】
  11. 湖南计算机保密防范系统,保密技术防护专用系统
  12. 基于FPGA的1080P 60Hz BT1120接口调试过程记录
  13. 使用OBS录屏神器,完美录制第二块屏幕。
  14. TCP报文段中的序号和确认号
  15. DDR3的配置及仿真教程
  16. 金仓数据库KingbaseES之WITH ORDINALITY
  17. 手机智能汽车钥匙来了, 汽车远程启动在手机上就能完成
  18. 352439-37-3,Amino-PEG8-alcohol,氨基-八聚乙二醇由氨基(NH2)和羟基(OH)组成
  19. 雷军的本命年:轮回中的挫败、幸运和逆袭
  20. CSS常用颜色配色的参数设置

热门文章

  1. 会写helloworld,不等于入门
  2. 【转】C语言中的符号优先级
  3. av_seek_frame() 定位为什么不准呢?
  4. 产生式模型和判别式模型
  5. 网上图书商城项目学习笔记-028编辑一级分类
  6. 2015.10.13课堂
  7. 在Eclipse/MyEclipse中安装spket插件
  8. Extjs GridPanel 监听事件 行选中背景
  9. tcmalloc编译
  10. windows API 菜鸟学习之路(四)