1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
#!/usr/bin/python
# Fetch More Example
# Ported to PyQt4 by Darryl Wallace, 2009 - wallacdj@gmail.com
from PyQt4 import QtCore, QtGui
class FileListModel(QtCore.QAbstractListModel):
numberPopulated = QtCore.pyqtSignal(int)
def __init__(self, parent=None):
super(FileListModel, self).__init__(parent)
self.fileCount = 0
self.fileList = []
def rowCount(self, parent=QtCore.QModelIndex()):
return self.fileCount
def data(self, index, role=QtCore.Qt.DisplayRole):
if not index.isValid():
return None
if index.row() >= len(self.fileList) or index.row() < 0:
return None
if role == QtCore.Qt.DisplayRole:
return self.fileList[index.row()]
if role == QtCore.Qt.BackgroundRole:
batch = (index.row() // 100) % 2
if batch == 0:
return QtGui.qApp.palette().base()
return QtGui.qApp.palette().alternateBase()
return None
def canFetchMore(self, index):
return self.fileCount < len(self.fileList)
def fetchMore(self, index):
remainder = len(self.fileList) - self.fileCount
itemsToFetch = min(100, remainder)
self.beginInsertRows(QtCore.QModelIndex(), self.fileCount,
self.fileCount + itemsToFetch)
self.fileCount += itemsToFetch
self.endInsertRows()
self.numberPopulated.emit(itemsToFetch)
def setDirPath(self, path):
dir = QtCore.QDir(path)
self.fileList = list(dir.entryList())
self.fileCount = 0
self.reset()
class Window(QtGui.QWidget):
def __init__(self, parent=None):
super(Window, self).__init__(parent)
model = FileListModel(self)
model.setDirPath(QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.PrefixPath))
label = QtGui.QLabel("Directory")
lineEdit = QtGui.QLineEdit()
label.setBuddy(lineEdit)
view = QtGui.QListView()
view.setModel(model)
self.logViewer = QtGui.QTextBrowser()
self.logViewer.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred))
lineEdit.textChanged.connect(model.setDirPath)
lineEdit.textChanged.connect(self.logViewer.clear)
model.numberPopulated.connect(self.updateLog)
layout = QtGui.QGridLayout()
layout.addWidget(label, 0, 0)
layout.addWidget(lineEdit, 0, 1)
layout.addWidget(view, 1, 0, 1, 2)
layout.addWidget(self.logViewer, 2, 0, 1, 2)
self.setLayout(layout)
self.setWindowTitle("Fetch More Example")
def updateLog(self, number):
self.logViewer.append("%d items added." % number)
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
|