📄 a1.pyw
字号:
#!/usr/bin/env python# -*- coding: cp936 -*-from __future__ import divisionimport sysfrom PyQt4 import QtCore, QtGuiclass Window(QtGui.QWidget): def __init__(self): QtGui.QWidget.__init__(self) self.proxyModel = QtGui.QSortFilterProxyModel() #(A)QSortFilterProxyModel提供从其他的model和view排序,过滤的操作,这是一个model来的 self.proxyModel.setDynamicSortFilter(True) # 动态的将两表关联起来,后者去关联前者 self.proxyGroupBox = QtGui.QGroupBox(u"分数排序") self.sourceView = QtGui.QTreeView() #建立资源的树形目录 self.sourceView.setRootIsDecorated(False) #要不要显示根目录的,false是不要 self.sourceView.setAlternatingRowColors(True) #两行要不要用不同的颜色显示的 self.insertButton = QtGui.QPushButton(u"插入成绩") self.quitButton = QtGui.QPushButton(u"退出程序") self.proxyView = QtGui.QTreeView() #“代表”目录,创建了一个 self.proxyView.setRootIsDecorated(False) #要不要显示根目录的,false是不要 self.proxyView.setAlternatingRowColors(True) #两行要不要用不同的颜色显示的 self.proxyView.setModel(self.proxyModel) #用到(A),QTreeView.setModel (self, QAbstractItemModel model),第二个treeview是与用的是proxymodel #是只有后面一个参数,传入的是一个sortfilterproxymodel,将一个具体的model传入了 self.proxyView.setSortingEnabled(True) #这个表的排序功能,允许排序功能(B) self.connect(self.quitButton, QtCore.SIGNAL('clicked()'), self.close) self.connect(self.insertButton, QtCore.SIGNAL('clicked()'), self.insertScore) proxyLayout = QtGui.QGridLayout() proxyLayout.addWidget(self.proxyView, 0, 0, 1, 4) proxyLayout.addWidget(self.insertButton,1,0,1,2) proxyLayout.addWidget(self.quitButton,1,2,1,2) self.proxyGroupBox.setLayout(proxyLayout) mainLayout = QtGui.QVBoxLayout() mainLayout.addWidget(self.proxyGroupBox) self.setLayout(mainLayout) self.setWindowTitle(u"分数排序系统") #对主窗口大小标题的定义 self.resize(400, 300) self.proxyView.sortByColumn(1, QtCore.Qt.AscendingOrder) #(B)上面允许了排序,这里指定排序是在列排序,而且默认是ascendingOrder(上升序列) def setSourceModel(self, model): #设置,源model,(传入的参数是一个model),这个函数在哪被调用了呢? self.proxyModel.setSourceModel(model) #调用,QSortFilterProxyModel里面的setSourceModel的方法(并使用函数传入的model) self.sourceView.setModel(model) #调用,QTreeView的setModel方法(使用传入,model) def insertScore(self): model.insertRow(0) def addScore(model, name=None, optolElec=None, Laser=None): #定义有6个参数的方法, model.insertRow(0) #插入row为0的行就是从最上面的一行开始插入 model.setData(model.index(0, 0), QtCore.QVariant(name)) #为行为0的index开始插入,相应的数据,#QVariant对string什么的,都直接显现值的,如果有color就要value的,文档规定的) model.setData(model.index(0, 1), QtCore.QVariant(ide)) model.setData(model.index(0, 2), QtCore.QVariant(avr)) #QVariant:QVariant::QVariant ( const QString & val ) #Constructs a new variant with a string value, val. ,用这个变型来传,就而不是直接传,这个也是有意思的 def createScoreModel(parent): #注意这个函数传入的是一个父类,因为它们不是Window类中的,所以要继承那个父类 global model model = QtGui.QStandardItemModel(0, 3, parent) model.setHeaderData(0, QtCore.Qt.Horizontal, QtCore.QVariant(u"姓名")) #就是在设horizonal的标题数据,这样用来显示的 model.setHeaderData(1, QtCore.Qt.Horizontal, QtCore.QVariant(u"光电子学")) model.setHeaderData(2, QtCore.Qt.Horizontal, QtCore.QVariant(u"激光原理")) #是调用的addMail的方法,第一是传入这里建的model,同时有三个变量,本来是0行3列,addMal里面是有插入的,所以是可以运行的 #data虽然有用,隔开,但是最后的都是输入data的范围的 return model #这里ruturn的意义是什么呢,不return的话就什么都不出现了,这样是没有意义的。一个名字空间,就是一个动作的执行了,这里比较麻烦 #这样就怎么提取这个model而不用再讲creatScoreModel再执行一次呢,这个有点麻烦啊 app = QtGui.QApplication(sys.argv)window = Window()window.setSourceModel(createScoreModel(window))#这里设置了sourceModel就是我们创建的以window()为父类的model,调用的createMailModel的方法,setSourceModel就是他的一个函数#所以是直接可以被调用的,如果用读取文件的方式怎么,作为这个类的调用呢window.show()sys.exit(app.exec_())
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -