我有要求顯示文件選擇對話框。我不能使用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));
}
在此先感謝。
你的具體問題是什麼? – bkausbk
@bkausbk添加了問題。謝謝。 – ramtheconqueror
爲什麼不使用QFileDialog,這正是你所需要的? – Blood