Как в QFileDialog видеть не только папки, но и mp3 файлы?

Код ниже показывает только папки. Как я могу при появлении диалогового окна видеть еще и mp3 файлы? Желательно, чтобы я их только видел, но не мог выбирать. Нужно выбирать только папки.

UPD: Как я понял, нужно как-то добавить QFileDialog.DontUseNativeDialog. Но как это сделать?

dialog = QFileDialog(self)
name_of_folder = QUrl(dialog.getExistingDirectoryUrl()).toString()

Ответы (1 шт):

Автор решения: S. Nick

QString QFileDialog::getExistingDirectory(
QWidget *parent = nullptr,
const QString &caption = QString(),
const QString &dir = QString(),
QFileDialog::Options options = ShowDirsOnly
)

Это удобная статическая функция, которая возвращает существующий каталог, выбранный пользователем.
...

Аргумент options содержит различные параметры запуска диалога, см. перечисление QFileDialog::Option для получения дополнительной информации о флагах, которые вы можете передать.

import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *


class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super().__init__()

        self.pushButton = QtWidgets.QPushButton(
            self.tr("Выбрать"), clicked=self.on_choose_btn_clicked    
        )
        
        self.path_le = QtWidgets.QLineEdit()
        
        self.listWidget = QtWidgets.QListWidget() 
        self.listWidget.clicked.connect(self.change_func)          
        
        central_widget = QtWidgets.QWidget()
        self.setCentralWidget(central_widget)
        grid_layout = QtWidgets.QGridLayout(central_widget)

        grid_layout.addWidget(self.pushButton, 0, 0)
        grid_layout.addWidget(self.path_le, 0, 1)
        grid_layout.addWidget(self.listWidget, 2, 0, 1, 2)
        
        self.filenames_list = [] 

    @QtCore.pyqtSlot()
    def on_choose_btn_clicked(self):
        directory = QtWidgets.QFileDialog.getExistingDirectory(
            options=QtWidgets.QFileDialog.DontUseNativeDialog                       # <---- 
        )
        if not directory:
            return

        self.filenames_list = []
        it = QtCore.QDirIterator(
            directory,
            ["*.mp3", "*.wav"],
            QtCore.QDir.Files,
            QtCore.QDirIterator.Subdirectories,
        )            
            
        while it.hasNext():
            filename = it.next()
            self.filenames_list.append(filename)

        if self.filenames_list:
            self.listWidget.clear()        
            self.path_le.setText(directory) 
            for filename in self.filenames_list:
                it = QtWidgets.QListWidgetItem(filename)
                self.listWidget.addItem(it)

    def change_func(self):
        item = QtWidgets.QListWidgetItem(self.listWidget.currentItem())
        print(f'row -> {self.listWidget.currentIndex().row()}; {item.text()}')
            

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = MainWindow()
    w.resize(500, 400)
    w.show()
    sys.exit(app.exec_())

введите сюда описание изображения

введите сюда описание изображения

введите сюда описание изображения

→ Ссылка