2013-08-30 54 views
0

我有要求顯示文件選擇對話框。我不能使用QFileDialog,因爲我們需要限制用戶對文件系統的訪問。我創建了QDialog的子類,它有2個QTreeView s;第一個僅用於顯示目錄,第二個僅用於顯示文件。我有2 QFileSystemModel s爲這些視圖提供內容,其中目錄列表模型按預期工作,但不是文件列表模型。文件列表模型/視圖並不總是顯示文件,有時甚至顯示父目錄和以前目錄中的文件。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));   
} 

在此先感謝。

+0

你的具體問題是什麼? – bkausbk

+0

@bkausbk添加了問題。謝謝。 – ramtheconqueror

+0

爲什麼不使用QFileDialog,這正是你所需要的? – Blood

回答

0

我相信你有,當你看到任何文件的問題是由於你的方式設置了QFileSystemDialog過濾器標誌: -

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

如果你看一下所有可能的選項,過濾器,它包括標誌,如這些: -

  • 的QDir ::可讀(顯示所有可讀文件的)
  • 的QDir ::可寫(顯示所有可寫文件)
  • 迪爾::可執行(顯示所有可執行文件)

通過設置只是一個QDir :: NoDotAndDotDot和一個QDir ::文件你消除所有的這些選項。

相反,根據默認設置設置所需的過濾器。例如: -

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

這將確保'。'和'..'路徑以及目錄都被排除在外。

在這個例子中,我們修改當前模型的過濾器,並在這種情況下使用not標誌(〜)來排除目錄。

相關問題