python3+PyQt5實(shí)現(xiàn)柱狀圖
更新時(shí)間:2018年04月24日 09:25:31 作者:basisworker
這篇文章主要為大家詳細(xì)介紹了python3+PyQt5實(shí)現(xiàn)柱狀圖的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
本文通過(guò)Python3+pyqt5實(shí)現(xiàn)了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_()
運(yùn)行結(jié)果:

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:
- python 畫條形圖(柱狀圖)實(shí)例
- python畫柱狀圖--不同顏色并顯示數(shù)值的方法
- python使用matplotlib繪制柱狀圖教程
- Python讀取Excel表格,并同時(shí)畫折線圖和柱狀圖的方法
- Python實(shí)現(xiàn)繪制雙柱狀圖并顯示數(shù)值功能示例
- Python數(shù)據(jù)可視化處理庫(kù)PyEcharts柱狀圖,餅圖,線性圖,詞云圖常用實(shí)例詳解
- python使用matplotlib畫柱狀圖、散點(diǎn)圖
- Python繪制堆疊柱狀圖的實(shí)例
- python繪制雙Y軸折線圖以及單Y軸雙變量柱狀圖的實(shí)例
- python繪制分組對(duì)比柱狀圖
相關(guān)文章
在Python Flask App中獲取已發(fā)布的JSON對(duì)象的解決方案
這篇文章主要介紹了在Python Flask App中獲取已發(fā)布的JSON對(duì)象的解決方案,文中通過(guò)代碼示例介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-08-08
Python實(shí)現(xiàn)繪制自定義形狀的詞云示例
這篇文章主要介紹了Python實(shí)現(xiàn)繪制自定義形狀的詞云示例,通過(guò)將一段文本中出現(xiàn)頻率高的單詞按其出現(xiàn)頻率大小以及顏色深淺排列成一個(gè)詞云圖形,從而更好地展示文本中的信息,需要的朋友可以參考下2022-10-10
python清洗疫情歷史數(shù)據(jù)的過(guò)程詳解
這篇文章主要介紹了python清洗疫情歷史數(shù)據(jù),包括數(shù)據(jù)獲取方法及使用python讀取csv的詳細(xì)代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-05-05
python3.8中關(guān)于sklearn問(wèn)題(win10)
這篇文章主要介紹了python3.8中關(guān)于sklearn問(wèn)題(win10),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
淺談django url請(qǐng)求與數(shù)據(jù)庫(kù)連接池的共享問(wèn)題
今天小編就為大家分享一篇淺談django url請(qǐng)求與數(shù)據(jù)庫(kù)連接池的共享問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08

