Get the indexes at the top and the bottom of the viewable area, and then iterate over the range of indexes they encompass:
def visibleItems(listwidget):
rect = listwidget.viewport().contentsRect()
top = listwidget.indexAt(rect.topLeft())
if top.isValid():
bottom = listwidget.indexAt(rect.bottomLeft())
if not bottom.isValid():
bottom = listwidget.model().index(listwidget.count() - 1)
for index in range(top.row(), bottom.row() + 1):
yield listwidget.item(index)