Search code examples
pythonpython-2.7pyqtpyqt4

How to set the pixmap and text to Qlabel by using pyqt4


Here i want to add Pixmap and text to QLabel,by using listdir i got the my filenames but the filenames are merging in loop, so can anyone please help me how to place the my filenames in QLabel.Please help me thank you in advance.

import os
from PyQt4 import QtCore, QtGui
class MyLabel(QtGui.QLabel):
    def __init__(self):
        super(MyLabel, self).__init__()

    def paintEvent(self, event):
        super(MyLabel, self).paintEvent(event)
        pos = QtCore.QPoint(100, 100)
        painter = QtGui.QPainter(self)

        s = iter(os.listdir("/home/cioc/Documents/pos/images"))
        # file1 = next(s)
        painter.drawText(pos,"vegitables")#here in place of vegitables i want to print the my filenames
        painter.setPen(QtGui.QColor(168, 34, 3))


class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        url = '/home/cioc/Documents/pos/images'
        highlight_dir = url

        self.scroll_area = QtGui.QScrollArea()

        self.scrollArea = QtGui.QScrollArea(widgetResizable=True)
        self.setCentralWidget(self.scrollArea)
        content_widget = QtGui.QWidget()
        self.scrollArea.setWidget(content_widget)
        self.layout = QtGui.QGridLayout(content_widget)

        self.files_it = iter([os.path.join(highlight_dir, file) for file in os.listdir(highlight_dir)])
        try:
            for row in range(3):
                for column in range(3):
                    file = next(self.files_it)
                    pixmap = QtGui.QPixmap(file)
                    self.label = MyLabel()
                    self.label.setPixmap(pixmap)
                    self.layout.addWidget(self.label,row,column)
        except StopIteration:
            pass

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    w = MainWindow()
    w.setGeometry(500,300,800,400)
    w.show()
    sys.exit(app.exec_())

Solution

  • It seems that the text and pixmap properties can not coexist since when one is established the previous one is eliminated. So a possible solution is to save in a new attribute.

    For this case I will use QDirIterator to obtain the files, and a QTimer to load the images a little since if you have many images there will be a delay in the sample of the application or a freezing of it.

    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_())
    

    Update:

    @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