Кажется, что свойства текста и растрового изображения не могут сосуществовать, так как, когда один установлен, предыдущий исключается.Поэтому возможным решением является сохранение в новом атрибуте.
Для этого случая я буду использовать QDirIterator для получения файлов и QTimer для небольшой загрузки изображений, так как если у вас много изображений, будет задержкав образце приложения или его замораживании.
from PyQt4 import QtCore, QtGui
class MyLabel(QtGui.QLabel):
def paintEvent(self, event):
super(MyLabel, self).paintEvent(event)
painter = QtGui.QPainter(self)
painter.setPen(QtGui.QColor(168, 34, 3))
painter.drawText(self.rect(), QtCore.Qt.AlignCenter, self.my_text)
class MainWindow(QtGui.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
highlight_dir = '/home/cioc/Documents/pos/images'
scrollArea = QtGui.QScrollArea(widgetResizable=True)
self.setCentralWidget(scrollArea)
content_widget = QtGui.QWidget()
scrollArea.setWidget(content_widget)
self._layout = QtGui.QGridLayout(content_widget)
self._it = QtCore.QDirIterator(highlight_dir)
self._row, self._col = 0, 0
QtCore.QTimer(self, interval=10, timeout=self.load_image).start()
@QtCore.pyqtSlot()
def load_image(self):
if self._it.hasNext():
pixmap = QtGui.QPixmap(self._it.next())
if not pixmap.isNull():
label = MyLabel(alignment=QtCore.Qt.AlignCenter)
label.my_text = self._it.fileName()
label.setPixmap(pixmap)
self._layout.addWidget(label, self._row, self._col)
self._col += 1
if self._col == 3:
self._row += 1
self._col = 0
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
w = MainWindow()
w.setGeometry(500, 300, 800, 400)
w.show()
sys.exit(app.exec_())
Обновление:
@QtCore.pyqtSlot()
def load_image(self):
if self._it.hasNext():
pixmap = QtGui.QPixmap(self._it.next())
if not pixmap.isNull():
vlay = QtGui.QVBoxLayout()
label_pixmap = QtGui.QLabel(alignment=QtCore.Qt.AlignCenter, pixmap=pixmap)
label_text = QtGui.QLabel(alignment=QtCore.Qt.AlignCenter, text=self._it.fileName())
vlay.addWidget(label_pixmap)
vlay.addWidget(label_text)
vlay.addStretch()
self._layout.addLayout(vlay, self._row, self._col)
self._col += 1
if self._col == 3:
self._row += 1
self._col = 0