📄 b2.pyw
字号:
#!/usr/bin/env python# -*- coding: cp936 -*-import 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.sourceGroupBox = QtGui.QGroupBox(u"话费原始模块") #设置box的名字,没关系 self.proxyGroupBox = QtGui.QGroupBox(u"话费查找模块") self.sourceView = QtGui.QTreeView() #建立资源的树形目录 self.sourceView.setRootIsDecorated(False) #要不要显示根目录的,false是不要 self.sourceView.setAlternatingRowColors(True) #两行要不要用不同的颜色显示的 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.feeButton = QtGui.QPushButton(u"计算话费") self.quitButton=QtGui.QPushButton(u"退出") self.callCheckButton = QtGui.QPushButton(u"话单查询") self.sortCaseSensitivityCheckBox = QtGui.QCheckBox("Case sensitive sorting") #创建了一个QCheckBox对象,还没有定义动作,定义了名字 self.filterCaseSensitivityCheckBox = QtGui.QCheckBox("Case sensitive filter") #同上 self.filterPatternLineEdit = QtGui.QLineEdit() #创建了一个单行输入的 self.filterPatternLabel = QtGui.QLabel(u"查询字段:") #创建一个label对象,写上名字 self.filterPatternLabel.setBuddy(self.filterPatternLineEdit) #这里设置了伙伴?有什么用处呢, 显现的是:如果将它去掉,则会显示&符号的。 self.filterSyntaxComboBox = QtGui.QComboBox() #建立一个下拉表单对象 self.filterSyntaxComboBox.addItem(u"正则表达式", QtCore.QVariant(QtCore.QRegExp.RegExp)) #给该对象加上item, 名字是,,addItem,是 #QComboBox.addItem (self, QString atext, QVariant auserData = QVariant()), #包含一个指定的userData(保存在Qt.UserRole里的) #QRegExp提供部分匹配用有规律的表达式 self.filterSyntaxComboBox.addItem("Wildcard", QtCore.QVariant(QtCore.QRegExp.Wildcard)) #很明显,这里的Wildcard和RegExp都是关键的字,是QRegExp里面的,所以是不能变动的,wildcard是指用通配符匹配 self.filterSyntaxComboBox.addItem("Fixed string", QtCore.QVariant(QtCore.QRegExp.FixedString)) #fixedstring是指用的是,固定字符串 self.filterSyntaxLabel = QtGui.QLabel("Filter &syntax:") #前面加上标签 self.filterSyntaxLabel.setBuddy(self.filterSyntaxComboBox) #将标签设为伙伴 self.filterColumnComboBox = QtGui.QComboBox() #建一个combobox对象 self.filterColumnComboBox.addItem(u"按姓名查询") #加上项目,共三个 self.filterColumnComboBox.addItem(u"按主叫电话号码查询") self.filterColumnComboBox.addItem(u"按被叫电话号码查询") self.filterColumnLabel = QtGui.QLabel(u"查询方式:") #加上lable self.filterColumnLabel.setBuddy(self.filterColumnComboBox) #设置伙伴 self.connect(self.filterPatternLineEdit, QtCore.SIGNAL('textChanged(const QString &)'), self.filterRegExpChanged) #对象,line输入端,信号,它的文本的变化,槽,filterRegExpChanged的函数 self.connect(self.filterSyntaxComboBox, QtCore.SIGNAL('currentIndexChanged(int)'), self.filterRegExpChanged) #对象,comboBox,变化,index的变化,(int型的返回),还是跟表达式函数链接,怎么两个都链接到一个函数呢 self.connect(self.filterColumnComboBox, QtCore.SIGNAL('currentIndexChanged(int)'), self.filterColumnChanged) #对于,下一个combobox,槽变成了,filtercolumnchanged()说明是栏变化了, self.connect(self.filterCaseSensitivityCheckBox, QtCore.SIGNAL('toggled(bool)'), self.filterRegExpChanged) #当被,选定后,也是指向filter函数的槽 self.connect(self.sortCaseSensitivityCheckBox, QtCore.SIGNAL('toggled(bool)'), self.sortChanged) #指向的是sortchanged函数 self.connect(self.feeButton, QtCore.SIGNAL('clicked()'), self.allFee) self.connect(self.quitButton, QtCore.SIGNAL('clicked()'), self.close) self.connect(self.callCheckButton, QtCore.SIGNAL('clicked()'), self.resetModel) proxyLayout = QtGui.QGridLayout() proxyLayout.addWidget(self.filterColumnLabel, 0, 0,) proxyLayout.addWidget(self.filterColumnComboBox, 0, 1, 1, 3) proxyLayout.addWidget(self.callCheckButton,0,4,1,2) proxyLayout.addWidget(self.filterPatternLabel, 1, 0) proxyLayout.addWidget(self.filterPatternLineEdit, 1, 1, 1, 3) proxyLayout.addWidget(self.feeButton,1,4,1,1) proxyLayout.addWidget(self.quitButton,1,5,1,1) proxyLayout.addWidget(self.proxyView, 2, 0, 1, 6) self.proxyGroupBox.setLayout(proxyLayout) sourceLayout = QtGui.QHBoxLayout() #下面是对layout的指定,就是这样的 sourceLayout.addWidget(self.sourceView) self.sourceGroupBox.setLayout(sourceLayout) mainLayout = QtGui.QVBoxLayout() mainLayout.addWidget(self.proxyGroupBox) mainLayout.addWidget(self.sourceGroupBox) self.setLayout(mainLayout) self.setWindowTitle(u"通信计费系统") #对主窗口大小标题的定义 self.resize(800, 600) self.proxyView.sortByColumn(1, QtCore.Qt.AscendingOrder) #(B)上面允许了排序,这里指定排序是在列排序,而且默认是ascendingOrder(上升序列) self.filterColumnComboBox.setCurrentIndex(0) #设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() #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型的 数字 syntax = QtCore.QRegExp.PatternSyntax(syntax_nr) #这是一个对象的创建,动作是对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,所以传入了一个数字就行了 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) #一个名字空间,指向的是,QRegExp.__init__ (self, QString pattern, Qt.CaseSensitivity cs = Qt.CaseSensitive, PatternSyntax syntax = QRegExp.RegExp) #第一个参数,字符串的部分,第二个是大小写敏感,是用的上面caseSensitivity的名字空间指向的类容,syntax的名字空间是,一个PatternSyntax方法,这个方法有个(syntax_nr)参数 #这个的意思很好玩了,而第三个是方法,就是RegExp,wildcard,fixedstring其中的一个,但是是个整体要写出来的 self.proxyModel.setFilterRegExp(regExp) #调用其中的Qsortfilterproxymodel中的方法,传入的是regExp名字空间代表的,表示了一种的方法的 #意思就是 设置 匹配 规律的 表达式 (regexp)是一个只低昂哈哦的QRegExp的方法了,传进去就是设定好了,是为,这个SortFilteProxyModel的一个方法 def filterColumnChanged(self): self.proxyModel.setFilterKeyColumn(self.filterColumnComboBox.currentIndex()*2) #还是在那个model里面的有一个方法,就是关键的栏,设一下就指定到那个栏了
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -