1

私は標準のファイルエクスプローラーのように構築しています-左側のペインはフォルダーツリー用で、右側のペインは選択したフォルダー内のファイルを表示するためのものです。

QFileSystemModelを使用したQTreeViewは、フォルダーを表示するために使用されます。モデルのフィルターはQDir::Dirs | QDir::NoDotAndDotDot、dirのみをリストし、ファイルをリストしないように設定されています。サブフォルダーのあるフォルダーに対してのみ拡張マークを表示したい。つまり、一部のディレクトリが空であるか、ファイルのみが含まれている場合は、拡張できないようにする必要があります。ただし、代わりに、ツリービューは空のディレクトリに対して拡張マークを保持します。そしてそれが問題です:それらを隠す方法は

私はここで、グーグルで、QTの例で解決策を検索しました-成功しませんでした。質問は、私が思うに、答えるのはとても簡単です。現時点で私が得た唯一の解決策は、QAbstractItemModelをサブクラス化することです。それは苦痛です。

QT 4.8、QT Creator、C++。

示すコードは次のとおりです。

#include <QApplication>

#include <QFileSystemModel>
#include <QTreeView>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QTreeView w;

    QFileSystemModel m;
    m.setFilter(QDir::Dirs | QDir::NoDotAndDotDot);
    m.setRootPath("C:\\");

    w.setModel(&m);
    w.setRootIndex(m.index(m.rootPath()));
    w.hideColumn(3);
    w.hideColumn(2);
    w.hideColumn(1);

    w.show();

    return a.exec();
}
4

2 に答える 2

2

私はこの問題を使用して解決しました

QFileSystemModel :: fetchMore

現在のレベルの各QModelIndexで。フォルダがモデルにロードされているかどうかを知るには、シグナルを使用できます

void directoryLoaded(const QString&path)

于 2013-02-19T12:30:53.260 に答える
2

最も簡単な方法:justeは次のようなhasChildrenを実装します。

/*!
 * Returns true if parent has any children and haven't the Qt::ItemNeverHasChildren flag set;
 * otherwise returns false.
 *
 *
 * \remarks Reimplemented to avoid empty directories to be collapsables
 *          and to implement the \c Qt::ItemNeverHasChildren flag.
 * \see     rowCount()
 * \see     child()
 *
 */
bool YourModelName::hasChildren(const QModelIndex &parent) const
{
    // return false if item cant have children
    if (parent.flags() &  Qt::ItemNeverHasChildren) {
        return false;
    }
    // return if at least one child exists
    return QDirIterator(
                filePath(parent),
                filter() | QDir::NoDotAndDotDot,
                QDirIterator::NoIteratorFlags
            ).hasNext();
}
于 2013-08-02T01:19:33.110 に答える