侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

python3+PyQt5实现柱状图

Python  /  管理员 发布于 7年前   245

本文通过Python3+pyqt5实现了python Qt GUI 快速编程的16章的excise例子。

#!/usr/bin/env python3import randomimport sysfrom 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,QPixmapclass 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结合ImageMagick实现多张图片合并为一个pdf文件的方法
    下一条:
    python3+PyQt5自定义视图详解
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(95个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客