Индексирование поля со списком PyQt5 при использовании QFileSystemModel

Мне нужно выбрать файл по умолчанию, который появляется в поле со списком из списка файлов в каталоге. В обычном поле со списком достаточно легко найти индекс нужного значения с помощью .findText, но это не работает для полей со списком QFileSystemModel, возможно, из-за того, что список параметров не заполняется до тех пор, пока не появится список каталогов. быть обеспеченным ресурсами.

Вот что я пробовал:

import sys
import collections
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QMainWindow, QLabel, QGridLayout, QWidget, QComboBox
from PyQt5.QtCore import QSize, QRect    

class ComboWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        self.setMinimumSize(QSize(640, 140))    
        self.setWindowTitle("Combobox example") 

        centralWidget = QWidget(self)          
        self.setCentralWidget(centralWidget)   

        # Create combobox and add items.
        self.fsm = QtWidgets.QFileSystemModel()        
        self.fsm.setNameFilters(["*.txt"]) 
        self.configComboBox = QtWidgets.QComboBox(self)
        self.configComboBox.setGeometry(QRect(40, 40, 491, 31))
        self.configComboBox.setObjectName(("comboBox"))
        self.configComboBox.setModel(self.fsm)                
        self.fsm.setFilter(QtCore.QDir.NoDotAndDotDot | QtCore.QDir.Files)        
        # "text_files" is a subdir of current dir with files 
        # example1.txt, example2.txt, example3.txt
        self.configComboBox.setRootModelIndex(self.fsm.setRootPath("text_files")) 
        # V V This section does not work V V
        index = self.configComboBox.findText(MainConfig.settings["default_txt_file"])
        self.configComboBox.setCurrentIndex(index)

class MainConfig:
    settings = collections.OrderedDict()  

    @staticmethod
    def createDefaultConfig(name):
        MainConfig.settings["default_txt_file"] = "example3.txt"     

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    mainWin = ComboWindow()
    mainWin.show()
    sys.exit( app.exec_() )

person OceanColorCoder    schedule 26.11.2019    source источник


Ответы (1)


Как я указал в этом ответе, QFileSystemModel загружается асинхронно в новом потоке, поэтому вы должны использовать сигнал directoryLoaded, чтобы узнать, когда загрузка информации завершена:

import collections
import os
import sys

from PyQt5.QtWidgets import (
    QApplication,
    QComboBox,
    QFileSystemModel,
    QMainWindow,
    QWidget,
)
from PyQt5.QtCore import pyqtSlot, QDir, QRect, QSize


class ComboWindow(QMainWindow):
    def __init__(self, parent=None):
        super(ComboWindow, self).__init__(parent=None)

        self.setMinimumSize(QSize(640, 140))
        self.setWindowTitle("Combobox example")

        centralWidget = QWidget(self)
        self.setCentralWidget(centralWidget)

        # Create combobox and add items.
        self.fsm = QFileSystemModel()
        self.fsm.setNameFilters(["*.txt"])
        self.configComboBox = QComboBox(self)
        self.configComboBox.setGeometry(QRect(40, 40, 491, 31))
        self.configComboBox.setObjectName(("comboBox"))
        self.configComboBox.setModel(self.fsm)
        self.fsm.setFilter(QDir.NoDotAndDotDot | QDir.Files)
        self.fsm.directoryLoaded.connect(self.on_directoryLoaded)
        current_dir = os.path.dirname(os.path.realpath(__file__))
        dir_path = os.path.join(current_dir, "text_files")
        self.configComboBox.setRootModelIndex(self.fsm.setRootPath(dir_path))

    @pyqtSlot(str)
    def on_directoryLoaded(self, path):
        index = self.configComboBox.findText(MainConfig.settings["default_txt_file"])
        self.configComboBox.setCurrentIndex(index)


class MainConfig:
    settings = collections.OrderedDict()

    @staticmethod
    def createDefaultConfig(name):
        MainConfig.settings["default_txt_file"] = name


if __name__ == "__main__":
    MainConfig.createDefaultConfig("example3.txt")
    app = QApplication(sys.argv)
    mainWin = ComboWindow()
    mainWin.show()
    sys.exit(app.exec_())
person eyllanesc    schedule 26.11.2019