python3 + PyQt5自定义视图详解

  

pyqt提供的几个视图类都可以较好工作,包括QLisView, QTableView和QTreeView。但是对于一些难以用现有的方式来呈现数据,这时,可以创建我们自己的视图子类并将其用做模型数据的可视化来解决这一问题。本文通过Python3 + pyqt5实现了python Qt GUI快速编程的16章的例子。

        # !/usr/bin/env python3      进口gzip   进口操作系统   进口平台   导入系统   从PyQt5。QtCore进口(QAbstractTableModel QDateTime QModelIndex,   Qt, QSize、QTimer QVariant pyqtSignal)   从PyQt5。QtGui进口(QColor QCursor QFont,   QFontDatabase、QFontMetrics QPainter、QPalette QPixmap)   从PyQt5。QtWidgets进口QApplication、QDialog QHBoxLayout、QLabel QMessageBox, QScrollArea, QSplitter, QTableView QWidget         (时间、温度、INLETFLOW、浊度、电导率,   凝固,RAWPH FLOCCULATEDPH)=(8)      TIMESTAMPFORMAT=" yyyy-MM-dd hh: mm”         类WaterQualityModel (QAbstractTableModel):      def __init__(自我,文件名):   超级(WaterQualityModel自我). __init__ ()   自我。文件名=文件名   自我。结果=[]         def负载(自我):   self.beginResetModel ()   异常=没有   跳频=没有   试一试:   如果不是self.filename:   提高IOError(“没有指定文件名加载”)那么   自我。结果=[]   line_data=https://www.yisu.com/zixun/gzip.open (self.filename) .read ()   在line_data.decode (use utf8) .splitlines ():   部分=line.rstrip () .split (", ")   日期=QDateTime.fromString(部分[0]+”:00”,   Qt.ISODate)      结果=[日期]   部分地区[1]:   result.append(浮动(部分)   self.results.append(结果)      除了(IOError,那么ValueError) e:   异常=e   最后:   如果没有没有:跳频   fh.close ()   self.endResetModel ()   如果异常不是没有:   提高异常         def数据(自我、索引的作用=Qt.DisplayRole):   如果(不是index.isValid()或   (0 & lt;=index.row () & lt;len (self.results))):   返回QVariant ()   列=index.column ()   结果=self.results [index.row ())   如果角色==Qt.DisplayRole:   项=结果(列)   如果列==时间戳:   #项=item.toString (TIMESTAMPFORMAT)   项=项   其他:   #项=QString (“% 1”)。arg(项目,0," f ", 2)   项=" {0:.2f} " .format(项)   返回项目==Qt.TextAlignmentRole elif作用:   如果列!=时间戳:   返回QVariant (int (Qt.AlignRight | Qt.AlignVCenter))   返回QVariant (int (Qt.AlignLeft | Qt.AlignVCenter))   elif角色====INLETFLOW Qt.TextColorRole和列:   如果结果(列)& lt;0:   返回QVariant (QColor (Qt.red))   elif (==Qt.TextColorRole和角色   列(RAWPH FLOCCULATEDPH)):   ph=结果(列)   如果ph值& lt;7:   返回QVariant (QColor (Qt.red))   elif ph祝辞=8:   返回QVariant (QColor (Qt.blue))   其他:   返回QVariant (QColor (Qt.darkGreen))   返回QVariant ()         def headerData(自我,部分,定位、角色=Qt.DisplayRole):   如果角色==Qt.TextAlignmentRole:   如果方向==Qt.Horizontal:   返回QVariant (int (Qt.AlignCenter))   返回QVariant (int (Qt.AlignRight | Qt.AlignVCenter))   如果角色!=Qt.DisplayRole:   返回QVariant ()   如果方向==Qt.Horizontal:   如果部分==时间戳:   返回“时间戳”   elif节==温度:   返回“\ u00B0”+“C”==INLETFLOW elif部分:   返回“流入”   elif节==浊度:   返回“南大”   elif节==导电率:   返回“\ u03BCS/厘米”   elif节==凝固:   返回“mg/L”==RAWPH elif部分:   返回“原始Ph值”==FLOCCULATEDPH elif部分:   Ph值返回“絮状物”   返回int (+ 1)         def rowCount(自我,指数=QModelIndex ()):   返回len (self.results)         def columnCount(自我,指数=QModelIndex ()):   返回8         类WaterQualityView (QWidget):   点击=pyqtSignal (QModelIndex)   FLOWCHARS=((0 x21dc),从而向科(0 x21dd)、科(0 x21c9))      def __init__(自我,父=None):   超级(WaterQualityView,自我). __init__(父)   自我。scrollarea=没有   自我。模型=没有   self.setFocusPolicy (Qt.StrongFocus)   自我。selectedRow=1   自我。flowfont=self.font ()   .pointSize大?self.font () ()   如果platform.system ()==癢indows”:   fontDb=QFontDatabase ()   脸的[face.toLower()面对fontDb.families ()):   如果face.contains (unicode):   自我。flowfont=QFont(脸、大小)   打破   其他:   自我。flowfont=QFont(“象征”,大小)   WaterQualityView。FLOWCHARS=((0 xac),从而向科(0机加区),   科(0 xde))         def setModel(自我,模型):   自我。模型=模型   # self.connect (self.model   #信号(“dataChanged (QModelIndex QModelIndex)”),   # self.setNewSize)   self.model.dataChanged.connect (self.setNewSize)   # self.connect(自我。模型、信号(“modelReset ()”), self.setNewSize)   self.model.modelReset.connect (self.setNewSize)   self.setNewSize ()         def setNewSize(自我):   self.resize (self.sizeHint ())   self.update ()   self.updateGeometry ()         def minimumSizeHint(自我):   大?self.sizeHint ()   调频=QFontMetrics (self.font ())   size.setHeight (fm.height () * 3)   返回的大小         def sizeHint(自我):   调频=QFontMetrics (self.font ())   大?fm.height ()   返回QSize (fm。宽度(“9999-99-99 99:99”)+(大小* 4)   (尺寸/4)+(大小* self.model.rowCount ()))         def paintEvent(自我、事件):   如果自我。模型没有:   返回   调频=QFontMetrics (self.font ())   timestampWidth=调频。宽度(“9999-99-99 99:99”)   大?fm.height ()   indicatorSize=int(大小* 0.8)   抵消=int(1.5 *(大小- indicatorSize))   如矿坑的=event.rect () .y ()   .height maxY=如矿坑的+ event.rect()() +大小   如矿坑的-=大小   画家=QPainter(自我)   painter.setRenderHint (QPainter.Antialiasing)   painter.setRenderHint (QPainter.TextAntialiasing)   y=0   的行范围(self.model.rowCount ()):   x=0   如果如矿坑的& lt;=y & lt;=maxY:   painter.save ()   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

python3 + PyQt5自定义视图详解