1

ファイル選択ダイアログを表示する必要があります。QFileDialogファイルシステムへのユーザーアクセスを制限する必要があるため、使用できません。QDialog2 つQTreeViewの sを持つサブクラスを作成しました。1 つ目はディレクトリのみを表示するためのもので、2 つ目はファイルのみを表示するためのものです。これらのビューにコンテンツを提供するために 2 つQFileSystemModelの s があります。ディレクトリ リスト モデルは期待どおりに機能しますが、ファイル リスト モデルは機能しません。ファイル リスト モデル/ビューは常にファイルを表示するとは限らず、親ディレクトリと前のディレクトリのファイルを表示することさえあります。

最初の (ディレクトリ ツリー) ビューで選択したディレクトリのファイルのみを表示するには?

以下は、私が試したコードスニペットです。

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));        
}

前もって感謝します。

4

1 に答える 1

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 フラグ (~) を使用してディレクトリを除外します。

于 2013-08-30T10:03:30.747 に答える