📄 b1.pyw
字号:
proxyLayout = QtGui.QGridLayout() proxyLayout.addWidget(self.proxyView, 0, 0, 1, 8) proxyLayout.addWidget(self.filterPatternLabel, 1, 0,) proxyLayout.addWidget(self.filterPatternLineEdit, 1, 1, 1, 7) proxyLayout.addWidget(self.filterSyntaxLabel, 2, 0) proxyLayout.addWidget(self.filterSyntaxComboBox, 2, 1, 1, 7) proxyLayout.addWidget(self.filterColumnLabel, 3, 0) proxyLayout.addWidget(self.filterColumnComboBox, 3, 1, 1, 7) proxyLayout.addWidget(self.filterCaseSensitivityCheckBox, 4, 0, 1, 2) proxyLayout.addWidget(self.sortCaseSensitivityCheckBox, 4, 2) self.proxyGroupBox.setLayout(proxyLayout) mainLayout = QtGui.QVBoxLayout() mainLayout.addWidget(self.sourceGroupBox) mainLayout.addWidget(self.proxyGroupBox) self.setLayout(mainLayout) self.setWindowTitle(u"成绩统计系统") #对主窗口大小标题的定义 self.resize(700, 600) self.proxyView.sortByColumn(1, QtCore.Qt.AscendingOrder) #(B)上面允许了排序,这里指定排序是在列排序,而且默认是ascendingOrder(上升序列) self.filterColumnComboBox.setCurrentIndex(1) #设filtercombo默认是index为1,是对栏的那个combo的默认是index为1,也就是对subject进行排序 self.filterPatternLineEdit.setText("") #设开始查询的是 Andy|Grace,这是个正则表达式 self.filterCaseSensitivityCheckBox.setChecked(True) #把这个都设了checked的符号 self.sortCaseSensitivityCheckBox.setChecked(True) def setSourceModel(self, model): #设置,源model,(传入的参数是一个model),这个函数在哪被调用了呢? self.proxyModel.setSourceModel(model) #调用,QSortFilterProxyModel里面的setSourceModel的方法(并使用函数传入的model) self.sourceView.setModel(model) #调用,QTreeView的setModel方法(使用传入,model) def filterRegExpChanged(self): #建立匹配的表达式变化的函数 syntax_nr, _ = self.filterSyntaxComboBox.itemData( self.filterSyntaxComboBox.currentIndex()).toInt() syntax = QtCore.QRegExp.PatternSyntax(syntax_nr) if self.filterCaseSensitivityCheckBox.isChecked(): caseSensitivity = QtCore.Qt.CaseSensitive #因为对于filter敏感,用一个if判断,当checked了(就是为真了),case sensitive就是大小写敏感 else: caseSensitivity = QtCore.Qt.CaseInsensitive #如果没有点就是,大小写不敏感的 regExp = QtCore.QRegExp( self.filterPatternLineEdit.text(), caseSensitivity, syntax) self.proxyModel.setFilterRegExp(regExp) def filterColumnChanged(self): self.proxyModel.setFilterKeyColumn(self.filterColumnComboBox.currentIndex()) #还是在那个model里面的有一个方法,就是关键的栏,设一下就指定到那个栏了 #就是将combobox的索引对应着那个栏就行了 def sortChanged(self): #排序时候的大小写敏感的设定,check了为真了就是toggled了就设大小写铭感的 if self.sortCaseSensitivityCheckBox.isChecked(): caseSensitivity = QtCore.Qt.CaseSensitive else: caseSensitivity = QtCore.Qt.CaseInsensitive self.proxyModel.setSortCaseSensitivity(caseSensitivity) #在这里设sort的casesensitivity的时候 传参是一个指向方法的,参数的方法也有用了 def classOverall(self): a =(88.4+77.8+77.1+81+91)/5 self.classOverallLineEdit.setText("%f" % a) return None def insertScore(self): model.insertRow(0) #self.proxyModel.setSourceModel(model) def addScore(model, name=None, ide=None, avr=None, mid=None,fin=None,stu=None,lev=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)) model.setData(model.index(0, 3), QtCore.QVariant(mid)) model.setData(model.index(0, 4), QtCore.QVariant(fin)) model.setData(model.index(0, 5), QtCore.QVariant(stu)) model.setData(model.index(0, 6), QtCore.QVariant(lev)) #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, 7, 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"平时成绩")) model.setHeaderData(3, QtCore.Qt.Horizontal, QtCore.QVariant(u"期中成绩")) model.setHeaderData(4, QtCore.Qt.Horizontal, QtCore.QVariant(u"期末成绩")) model.setHeaderData(5, QtCore.Qt.Horizontal, QtCore.QVariant(u"学生总评")) model.setHeaderData(6, QtCore.Qt.Horizontal, QtCore.QVariant(u"成绩等级")) addScore(model, u"钱敏明", "B06040622",80,90,100,80*0.3+90*0.3+100*0.4,"A") addScore(model, u"钱林华", "B06040623",70,80,90,70*0.3+80*0.3+90*0.4,"B") addScore(model, u"夏耀峰", "B06040624",75,94,66,75*0.3+94*0.3+66*0.4,"C") addScore(model, u"黄茂云", "B06040625",80,78,76,80*0.3+78*0.3+76*0.4,"C") addScore(model, u"其他人", "B060406XX",77,87,98,77*0.3+87*0.3+98*0.4,"B") #是调用的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_()) #toInt是有两个参数的(x,ture/false),所以前面赋值用个逗号间隔开两个的, #调用itemData方法,传入函数的是目前的index,并将它转换成Int,而int的数传给syntax_nr的,这样很好 #return的是data for the given role QVariant QComboBox.itemData (self, int index, int role = Qt.UserRole) #而默认是有Qt.UserRole输入的,返回的类型本来是个QVariant,但是为什么用个Int呢, #答案是这里传回的的确是一个 Int型的 数字#这是一个对象的创建,动作是对Returns the syntax used by the regular expression. The default is QRegExp.RegExp.(syntax语法)返回默认RegExp的语法(而为什么传syntax_nr的参数呢) #而syntax是一个序号呢,是从combo里面得到的呢,难道这里的PatternSyntax输入的数字是与RegExp,wildcard,fixedstring有关的 #是有关的RegExp是0,WildCard是1,FixedString是2,所以传入了一个数字就行了 #一个名字空间,指向的是,QRegExp.__init__ (self, QString pattern, Qt.CaseSensitivity cs = Qt.CaseSensitive, PatternSyntax syntax = QRegExp.RegExp) #第一个参数,字符串的部分,第二个是大小写敏感,是用的上面caseSensitivity的名字空间指向的类容,syntax的名字空间是,一个PatternSyntax方法,这个方法有个(syntax_nr)参数 #这个的意思很好玩了,而第三个是方法,就是RegExp,wildcard,fixedstring其中的一个,但是是个整体要写出来的 #调用其中的Qsortfilterproxymodel中的方法,传入的是regExp名字空间代表的,表示了一种的方法的 #意思就是 设置 匹配 规律的 表达式 (regexp)是一个只低昂哈哦的QRegExp的方法了,传进去就是设定好了,是为,这个SortFilteProxyModel的一个方法#今天遇到的第三个model,标准项目model,第一个是rows,第二个是columns,和父类 #这里的父类是Window类,就是我们自己建的类 #这又是创建了一个名字空间
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -