【问题标题】:How to set the pixmap and text to Qlabel by using pyqt4如何使用 pyqt4 将像素图和文本设置为 Qlabel
【发布时间】:2019-05-28 08:00:06
【问题描述】:

在这里,我想将 Pixmap 和文本添加到 QLabel,通过使用 listdir,我得到了我的文件名,但文件名正在循环中合并,所以任何人都可以帮助我如何将我的文件名放在 QLabel 中。请帮助我,谢谢提前。

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

【问题讨论】:

  • 您希望图像在文本中吗?还是您希望图像位于文本下方?
  • 好的,我猜你希望我在图像的中心。我是正确的?另一方面,您是只想要 9 张图片还是希望所有图片都显示在 3 列中?
  • 你想让列的数量根据窗口的宽度变化吗?
  • 你已经把我弄糊涂了,你想要3行多少列?
  • 从文本中我很清楚,现在让我们使用数字,假设有 40 张图像。应该有多少行和列?

标签: python python-2.7 pyqt pyqt4


【解决方案1】:

似乎文本和像素图属性不能共存,因为当建立一个时,前一个就被消除了。所以一个可能的解决方案是保存一个新属性。

对于这种情况,我将使用 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

【讨论】:

  • 先生,非常感谢您,我可以知道文本下方的另一种方法图像吗?
猜你喜欢
  • 1970-01-01
  • 2018-05-31
  • 2019-05-23
  • 2011-06-02
  • 2014-12-10
  • 2020-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多