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 PySide2 import QtCore, QtGui
class FileListModel(QtCore.QAbstractListModel):
numberPopulated = QtCore.Signal(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_())
|