pyqt提供的几个视图类都可以较好工作,包括QLisView,QTableView和QTreeView。但是对于一些难以用现有的方式来呈现数据,这时,可以创建我们自己的视图子类并将其用做模型数据的可视化来解决这一问题。本文通过Python3+pyqt5实现了python
Qt GUI 快速编程的16章的例子。
#!/usr/bin/env python3
import gzip
import os
import platform
import sys
from PyQt5.QtCore import (QAbstractTableModel, QDateTime, QModelIndex,
QSize, QTimer, QVariant, Qt,pyqtSignal)
from PyQt5.QtGui import ( QColor, QCursor, QFont,
QFontDatabase, QFontMetrics, QPainter, QPalette, QPixmap)
from PyQt5.QtWidgets import QApplication,QDialog,QHBoxLayout, QLabel, QMessageBox,QScrollArea, QSplitter, QTableView,QWidget
(TIMESTAMP, TEMPERATURE, INLETFLOW, TURBIDITY, CONDUCTIVITY,
COAGULATION, RAWPH, FLOCCULATEDPH) = range(8)
TIMESTAMPFORMAT = "yyyy-MM-dd hh:mm"
class WaterQualityModel(QAbstractTableModel):
def __init__(self, filename):
super(WaterQualityModel, self).__init__()
self.filename = filename
self.results = []
def load(self):
self.beginResetModel()
exception = None
fh = None
try:
if not self.filename:
raise IOError("no filename specified for loading")
self.results = []
line_data = gzip.open(self.filename).read()
for line in line_data.decode("utf8").splitlines():
parts = line.rstrip().split(",")
date = QDateTime.fromString(parts[0] + ":00",
Qt.ISODate)
result = [date]
for part in parts[1:]:
result.append(float(part))
self.results.append(result)
except (IOError, ValueError) as e:
exception = e
finally:
if fh is not None:
fh.close()
self.endResetModel()
if exception is not None:
raise exception
def data(self, index, role=Qt.DisplayRole):
if (not index.isValid() or
not (0 <= index.row() < len(self.results))):
return QVariant()
column = index.column()
result = self.results[index.row()]
if role == Qt.DisplayRole:
item = result[column]
if column == TIMESTAMP:
#item = item.toString(TIMESTAMPFORMAT)
item=item
else:
#item = QString("%1").arg(item, 0, "f", 2)
item = "{0:.2f}".format(item)
return item
elif role == Qt.TextAlignmentRole:
if column != TIMESTAMP:
return QVariant(int(Qt.AlignRight|Qt.AlignVCenter))
return QVariant(int(Qt.AlignLeft|Qt.AlignVCenter))
elif role == Qt.TextColorRole and column == INLETFLOW:
if result[column] < 0:
return QVariant(QColor(Qt.red))
elif (role == Qt.TextColorRole and
column