QFileDialog 为所有支持的图像格式创建一个过滤器

QFileDialog create a filter for all supported image formats

我想用所有支持的图像格式(我可以用来实例化 QIcon 的所有文件类型)打开 QFileDialog.getOpenFileName

我已经知道我可以使用 QImageReader.supportedImageFormats() 获得所有支持的图像格式。

让我感到困惑的是 QImageReader.supportedImageFormats() returns 列表 QBytesArray,我不确定如何将其简单地转换为 str 列表。

class ProfileImageButton(qt.QToolButton):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setIconSize(qt.QSize(100, 100))
        self.clicked.connect(self._onClick)
        self._icon_path = None

    def _onClick(self, checked):
        supportedFormats = qt.QImageReader.supportedImageFormats()
        print([str(fo) for fo in supportedFormats])
        # this prints: ["b'bmp'", "b'cur'", "b'gif'", "b'icns'", "b'ico'", "b'jpeg'",

        fname, filter_ = qt.QFileDialog.getOpenFileName(
            parent=self,
            caption="Load a profile picture",)
            # filter=???????????)   #     <--- TODO

        if fname:
            self.setIcon(qt.QIcon(fname))
            self.setIconSize(qt.QSize(100, 100))
            self._icon_path = fname

    def iconPath(self):
        return self._icon_path

您必须使用 data() 方法将 QByteArray 转换为 bytes,然后使用 decode() 将字节转换为 string。然后只是拼接得到需要的格式。

text_filter = "Images ({})".format(" ".join(["*.{}".format(fo.data().decode()) for fo in supportedFormats]))

fname, _ = qt.QFileDialog.getOpenFileName(
    parent=self,
    caption="Load a profile picture", 
    filter=text_filter
)