1

我正在开发 Qt 应用程序,我需要在Qtreeview. 基本上我的想法是自定义文件系统,使可移动驱动器属于一个部分,而本地驱动器属于另一个部分。我尝试使用它来实现它,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);

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

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

- Removable Drives

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

4

2 回答 2

2

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

如果您的目标是呈现文件系统列表的自定义分组,您可能会尝试使用多个 QFileSystemModel实例,并为每个驱动器设置根。因此,您将继续设置顶级驱动器,但对于每个驱动器,您可能需要将模型设置为该根。然后在这些项目和它们的私有模型之间创建一个映射。

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

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

于 2012-12-14T17:55:47.403 回答
0

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

于 2013-01-18T23:38:03.863 回答