Показать несколько изображений - PullRequest
0 голосов
/ 09 декабря 2018

Я новичок в PyQt4 и пытаюсь показать изображения внутри QScrollArea, но мне удается показать только одно и всегда последнее изображение.Как я могу показать несколько изображений внутри QScrollArea?Есть ли лучший способ показать несколько изображений?

Вот мой код:

scrollArea = QtGui.QScrollArea(self)
scrollArea.setWidgetResizable(False)
scrollArea.setGeometry(210, 150, 800, 450)
highlightLbl = QtGui.QLabel(self)
highlight_dir = url + '\\highlighted'
scrollArea = QtGui.QScrollArea(self)
scrollArea.setWidgetResizable(False)
scrollArea.setGeometry(210, 150, 800, 450)
for file in os.listdir(highlight_dir):
    highlighted_img = QtGui.QPixmap(os.path.join(highlight_dir, file))
    highlightLbl.setPixmap(highlighted_img)
    scrollArea.setWidget(highlightLbl) 

1 Ответ

0 голосов
/ 09 декабря 2018

QScrollArea вы можете установить только виджет, но если вы хотите показать несколько, вы должны разместить его, используя макет для этого отдельного виджета.С другой стороны, в вашем коде вы используете один QLabel, а в цикле вы меняете только изображение, поэтому вы видите только последнее изображение.

Учитывая вышеизложенное, решение выглядит следующим образом:

import os
from PyQt4 import QtCore, QtGui

class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        url = # ...
        highlight_dir = url + '\\highlighted'

        self.scrollArea = QtGui.QScrollArea(widgetResizable=True)
        self.setCentralWidget(self.scrollArea)
        content_widget = QtGui.QWidget()
        self.scrollArea.setWidget(content_widget)
        lay = QtGui.QVBoxLayout(content_widget)

        for file in os.listdir(highlight_dir):
            pixmap = QtGui.QPixmap(os.path.join(highlight_dir, file))
            if not pixmap.isNull():
                label = QtGui.QLabel(pixmap=pixmap)
                lay.addWidget(label)

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

С другой стороны, если в папке много изображений, виджет будет задерживаться при отображении, и это может быть неприятно для пользователя, возможной альтернативой является использование итерации с QTimer для небольшой загрузки изображений.понемногу.

import os
from PyQt4 import QtCore, QtGui

class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        url = # ...
        highlight_dir = url + '\\highlighted'

        self.scrollArea = QtGui.QScrollArea(widgetResizable=True)
        self.setCentralWidget(self.scrollArea)
        content_widget = QtGui.QWidget()
        self.scrollArea.setWidget(content_widget)
        self._lay = QtGui.QVBoxLayout(content_widget)

        self.files_it = iter([os.path.join(highlight_dir, file) for file in os.listdir(highlight_dir)])

        self._timer = QtCore.QTimer(self, interval=1)
        self._timer.timeout.connect(self.on_timeout)
        self._timer.start()

    def on_timeout(self):
        try:
            file = next(self.files_it)
            pixmap = QtGui.QPixmap(file)
            self.add_pixmap(pixmap)
        except StopIteration:
            self._timer.stop()

    def add_pixmap(self, pixmap):
        if not pixmap.isNull():
            label = QtGui.QLabel(pixmap=pixmap)
            self._lay.addWidget(label)

if __name__ == '__main__':
    import sys
    app = QtGui.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())

PyQt5:

import os
from PyQt5 import QtCore, QtGui, QtWidgets

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        url = # ...
        highlight_dir = url + '\\highlighted'

        self.scrollArea = QtWidgets.QScrollArea(widgetResizable=True)
        self.setCentralWidget(self.scrollArea)
        content_widget = QtWidgets.QWidget()
        self.scrollArea.setWidget(content_widget)
        self._lay = QtWidgets.QVBoxLayout(content_widget)

        self.files_it = iter([os.path.join(highlight_dir, file) for file in os.listdir(highlight_dir)])

        self._timer = QtCore.QTimer(self, interval=1)
        self._timer.timeout.connect(self.on_timeout)
        self._timer.start()

    def on_timeout(self):
        try:
            file = next(self.files_it)
            pixmap = QtGui.QPixmap(file)
            self.add_pixmap(pixmap)
        except StopIteration:
            self._timer.stop()

    def add_pixmap(self, pixmap):
        if not pixmap.isNull():
            label = QtWidgets.QLabel(pixmap=pixmap)
            self._lay.addWidget(label)

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.show()
    sys.exit(app.exec_())
...