【问题标题】:Indexing PyQt5 combobox when using QFileSystemModel使用 QFileSystemModel 时索引 PyQt5 组合框
【发布时间】:2020-03-22 02:42:08
【问题描述】:

我需要从文件的目录列表中选择出现在组合框中的默认文件。使用普通的组合框,很容易使用 .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_() )

【问题讨论】:

    标签: python pyqt5 qcombobox qfilesystemmodel


    【解决方案1】:

    正如我在this answer 中指出的那样,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_())
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-04
      • 1970-01-01
      • 1970-01-01
      • 2020-05-02
      • 2017-01-23
      • 1970-01-01
      • 1970-01-01
      • 2016-10-26
      相关资源
      最近更新 更多