本篇文章為大家展示了怎么在python3中利用PyQt5實(shí)現(xiàn)一個(gè)柱狀圖,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
Python主要應(yīng)用于:1、Web開(kāi)發(fā);2、數(shù)據(jù)科學(xué)研究;3、網(wǎng)絡(luò)爬蟲(chóng);4、嵌入式應(yīng)用開(kāi)發(fā);5、游戲開(kāi)發(fā);6、桌面應(yīng)用開(kāi)發(fā)。
#!/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_()
上述內(nèi)容就是怎么在python3中利用PyQt5實(shí)現(xiàn)一個(gè)柱狀圖,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
名稱欄目:怎么在python3中利用PyQt5實(shí)現(xiàn)一個(gè)柱狀圖-創(chuàng)新互聯(lián)
新聞來(lái)源:http://sd-ha.com/article28/ddoojp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)、手機(jī)網(wǎng)站建設(shè)、關(guān)鍵詞優(yōu)化、網(wǎng)頁(yè)設(shè)計(jì)公司、營(yíng)銷型網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容