ホームページ > バックエンド開発 > Python チュートリアル > python3+PyQt5はヒストグラムを実装します

python3+PyQt5はヒストグラムを実装します

不言
リリース: 2018-04-24 11:41:55
オリジナル
5491 人が閲覧しました

この記事では主に python3+PyQt5 でヒストグラムを実装する方法を詳しく紹介します。興味のある方は参考にしてください。この記事は Python3+pyqt5 の例を抜粋して Python Qt GUI を実装します。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

#!/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_()

ログイン後にコピー

実行結果:

関連する推奨事項:


python3+PyQt5でドキュメント印刷機能を実装

以上がpython3+PyQt5はヒストグラムを実装しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート