Qt:在QTreeView中以自定义方式显示文件系统

时间:2012-12-14 17:28:21

标签: c++ qt qt4 filesystems

我正在使用Qt app,我需要在Qtreeview内显示Filesystem。基本上我的想法是自定义文件系统,使可移动驱动器位于一个部分,本地驱动器位于另一个部分之下。我尝试使用QFSFileEngine来实现它,但我在某种程度上取得了成功。这是代码:

pSystemSecondaryModel = new QFileSystemModel(this);
pSystemSecondaryModel->setRootPath(QDir::currentPath());

list = QFSFileEngine::drives();
for(int i = 0; i < list.size(); i++)
{
    qDebug() << list.at(i).absoluteDir();
}

m_model = new QStandardItemModel(0,0);

QList<QStandardItem *> LocalItem;
LocalItem.insert(0,new QStandardItem("Local Drives"));
LocalItem.at(0)->setEditable(false);
m_model->insertRow(0,LocalItem);

QList<QStandardItem *> RemovableItem;
RemovableItem.insert(0,new QStandardItem("Removable Drives"));
RemovableItem.at(0)->setEditable(false);
m_model->insertRow(1,RemovableItem);

for (int i = 0; i < list.count(); i++)
{
    QString str = list.at(i).absolutePath();
    Localchild = new QStandardItem(str);
    QStandardItem* LocalparentItem = m_model->item(0,0);
    Localchild->setEditable(false);
    LocalparentItem->appendRow(Localchild);
}

QStandardItem* Removablechild = new QStandardItem();
QStandardItem* RemovableparentItem = m_model->item(1,0);
Removablechild->setEditable(false);
RemovableparentItem->appendRow(Removablechild);
ui->PrimTreeView->setModel(m_model);

当我运行应用程序时,它会显示本地驱动器和可移动驱动器根节点。在Local Drive节点下,我发现所有C:D:E:等作为子节点,而可移动驱动器似乎是空的,即没有任何子节点。 这是当前输出的场景:

- Local Drives
   C:/
   D:/
   E:/

- Removable Drives

但是当我点击每个驱动器时,我根本看不到子目录。理想情况下,当我点击C:/我应该能够看到WindowsProgram Files文件夹等。它完全是空的。我怎样才能实现它?请帮忙

2 个答案:

答案 0 :(得分:2)

您可能知道,您根本没有使用QFileSystemModel,只需使用您查找的手动条目填充QStandardItemModel

如果您的目标是提供文件系统列表的自定义分组,那么您可能尝试并执行的操作是使用多个QFileSystemModel实例,并将根设置为每个驱动器。因此,您将继续设置顶级驱动器,但对于每个驱动器,您可能需要将模型设置为该根。然后在这些项目和他们的私人模型之间创建一个地图。

然后,您必须重新实现index,hasChildren,rowCount,columnCount以及其他一些只读方法,以检查这些驱动器的模型。因此,如果模型需要知道C:/是否有子项,那么您的hasChildren()必须查找该索引到隐藏C:/根模型的映射,并进行子计数在那个模型上。

另一种方法是仅将QStandardItemModel(或QAbstractItemModel)子类化并自行执行文件系统列表,而不是使用QFileSystemModel。这将允许您只设置固定的根项目,类别和驱动器号,然后在列表展开或折叠时检查列表。同样,这将需要子类化一个并不总是很好的初学者Qt经验的模型。

答案 1 :(得分:0)

如果我误解了你的问题,请原谅我,但我认为你正在寻找类似于this

的东西