QFilesystemModel仅显示文件

时间:2013-08-30 08:39:35

标签: c++ qt

我要求显示文件选择对话框。我无法使用QFileDialog因为我们需要限制用户对文件系统的访问权限。我创建了一个QDialog的子类,它有2 QTreeView个;第一个用于仅显示目录,第二个用于仅显示文件。我有两个QFileSystemModel来为这些视图提供内容,其中目录列表模型按预期工作,但不是文件列表模型。文件列表模型/视图并不总是显示文件,有时甚至显示父目录和以前目录中的文件。

如何仅显示第一个(目录树)视图中所选目录中的文件?

以下是我试过的代码段。

FileDialogue1::FileDialogue1(const QStringList& locs, QWidget* prnt)
    : QDialog(prnt)
{
    QHBoxLayout* hlayout = new QHBoxLayout(this);
    m_splitter = new QSplitter(this);
    m_dir_view = new QTreeView(m_splitter);
    m_dir_model = new QFileSystemModel(m_dir_view);
    m_dir_model->setFilter(QDir::NoDotAndDotDot | QDir::AllDirs);
    m_dir_view->setModel(m_dir_model);
    connect(m_dir_view, SIGNAL(clicked(QModelIndex)), SLOT(loadFileList(QModelIndex)));
    m_file_view = new QTreeView(m_splitter);
    m_file_model = new FileSystemModel(m_file_view);
    m_file_model->setFilter(QDir::NoDotAndDotDot | QDir::Files);
    m_file_view->setModel(m_file_model);

    // restrict user selection
    QGroupBox* locs_gb = new QGroupBox(tr("Available locations"), this);
    QVBoxLayout* vlayout = new QVBoxLayout(locs_gb);
    QSignalMapper* mapper = new QSignalMapper(locs_gb);
    connect(mapper, SIGNAL(mapped(QString)), SLOT(changeLocation(QString)));
    foreach (const QString& loc, locs)
    {
        QRadioButton* radio = new QRadioButton(loc, locs_gb);
        vlayout->addWidget(radio, 0, Qt::AlignTop | Qt::AlignLeft);
        connect(radio, SIGNAL(clicked()), mapper, SLOT(map()));
        mapper->setMapping(radio, loc);
    }
    vlayout->addStretch(1);

    hlayout->addWidget(locs_gb, 0, Qt::AlignLeft);
    hlayout->addWidget(m_splitter);

    setMinimumSize(MIN_SIZE);
}


void FileDialogue1::changeLocation(const QString& path)
{        
    m_dir_view->setRootIndex(m_dir_model->setRootPath(path));
}    

void FileDialogue1::loadFileList(const QModelIndex& idx)
{        
    const QString path(m_dir_model->fileInfo(idx).absolutePath());
    m_file_view->setRootIndex(m_file_model->setRootPath(path));        
}

提前致谢。

1 个答案:

答案 0 :(得分:0)

我相信当您看不到文件时遇到的问题是由于您为QFileSystemDialog设置过滤器标志的方式: -

m_file_model->setFilter(QDir::NoDotAndDotDot | QDir::Files);

如果您查看过滤器的所有可能选项,它包括以下标志: -

  • QDir :: Readable(显示所有可读文件)
  • QDir :: Writable(显示所有可写文件)
  • Dir :: Executable(显示所有可执行文件)

通过设置QDir :: NoDotAndDotDot和QDir :: Files,您将消除所有这些选项。

而是根据默认设置设置所需的过滤器。例如: -

m_file_model->setFilter(m_file_model->filter() | QDir::NoDotAndDotDot | ~QDir::Dirs);

哪会确保'。'和'..'路径以及目录都被排除在外。

在这个例子中,我们修改当前模型的过滤器,并在这种情况下使用not标志(〜)排除目录。