Python PyQt Pyside - QFileDialog中的setNameFilters无法工作

4

(Windows 7 64位,PyCharm 3.4.1专业版,Python 3.4.0,PySide 1.2.2)

我想制作一个带有过滤器并预选一个过滤器的文件对话框。

如果我使用静态方法,它可以工作,我可以使用过滤器并预选一个过滤器。

dir = self.sourceDir
filters = "Text files (*.txt);;Images (*.png *.xpm *.jpg)"
selected_filter = "Images (*.png *.xpm *.jpg)"
fileObj = QFileDialog.getOpenFileName(self, " File dialog ", dir, filters, selected_filter)

如果我使用对象,它不起作用,我的过滤器不在那里。
file_dialog = QFileDialog(self)
file_dialog.setNameFilters("Text files (*.txt);;Images (*.png *.jpg)")
file_dialog.selectNameFilter("Images (*.png *.jpg)")
file_dialog.getOpenFileName() 

为什么这个不起作用?

输入图片描述 输入图片描述

2个回答

15

您对QFileDialog的工作原理存在误解。

getOpenFileNamegetSaveFileName等函数是静态的。它们创建了一个内部的文件对话框对象,并且函数的参数用于设置其属性。

但是,当您使用QFileDialog构造函数时,它会创建一个外部的实例,因此在其上设置属性不会对静态函数创建的内部的文件对话框对象产生影响。

相反,您需要做的是显示您创建的外部实例:

file_dialog = QFileDialog(self)
# the name filters must be a list
file_dialog.setNameFilters(["Text files (*.txt)", "Images (*.png *.jpg)"])
file_dialog.selectNameFilter("Images (*.png *.jpg)")
# show the dialog
file_dialog.exec_()

“...你将始终获得内置的Qt文件对话框。” 嗯,在Windows上(例如在问题中看到的图像),两个对话框看起来非常相似。我想知道如何获取非本机文件对话框以及如何识别它? - Trilarion
@Trilarion。自我回答后可能已经发生了变化。尝试使用:dialog.setOption(QFileDialog.DontUseNativeDialog)。(PS: 我现在已经删除了答案的那部分,因为它与问题没有真正的关联)。 - ekhumoro
没错,这个可行。在Windows和Qt5上,本地对话框是默认的。 - Trilarion

1

全局解决方案在这里。您可以获取目录、文件名和文件扩展名。您可以使用它:

d = Dialog(self)
        d.filters = ['A dosyaları (*.aaa)', 'B Dosyaları (*.bbb)', 'C Dosyaları (*.ccc)', 'Tüm Dosyalar (*.*)']
        d.default_filter_index = 3
        d.exec()
        print(d.filename)
        print(d.path)

这里有一个类(class)!

from PyQt5.QtWidgets import QFileDialog, QDialog
import os


class Dialog():

    def __init__(self, mainform):
        self.__mainform = mainform
        self.__dialog = QFileDialog()
        self.__directory = ''
        self.__filename = ['', '', '']
        self.__filters = []
        self.__default_filter_index = 0
        self.__path = ''

    @property
    def path(self):
        return self.__path

    @property
    def filename(self):
        return self.__filename

    @property
    def directory(self):
        return self.__directory

    @directory.setter
    def directory(self, value):
        self.__directory = value

    @property
    def filters(self):
        return self.__filters

    @filters.setter
    def filters(self, value):
        self.__filters = value

    @property
    def default_filter_index(self):
        return self.__default_filter_index

    @default_filter_index.setter
    def default_filter_index(self, value):
        self.__default_filter_index = value

    def exec(self, load =True):
        self.__dialog.setNameFilters(self.__filters)
        self.__dialog.selectNameFilter(self.__filters[self.__default_filter_index])
        self.__dialog.setDirectory(self.__directory)
        if load == True:
            self.__dialog.setLabelText(QFileDialog.Accept, 'Aç')
            self.__dialog.setWindowTitle('Aç')
        else:
            self.__dialog.setLabelText(QFileDialog.Accept, 'Kaydet')
            self.__dialog.setWindowTitle('Kaydet')
        if self.__dialog.exec() == QDialog.Accepted:
            self.__path = self.__dialog.selectedFiles()[0]
            fn = os.path.split(self.__path)
            ex = os.path.splitext(self.__path)[1]
            self.__filename = [fn[0], fn[1], ex[1:len(ex)]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接