我正在使用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:/我应该能够看到Windows
,Program Files
文件夹等。它完全是空的。我怎样才能实现它?请帮忙
答案 0 :(得分:2)
您可能知道,您根本没有使用QFileSystemModel
,只需使用您查找的手动条目填充QStandardItemModel
。
如果您的目标是提供文件系统列表的自定义分组,那么您可能尝试并执行的操作是使用多个QFileSystemModel
实例,并将根设置为每个驱动器。因此,您将继续设置顶级驱动器,但对于每个驱动器,您可能需要将模型设置为该根。然后在这些项目和他们的私人模型之间创建一个地图。
然后,您必须重新实现index,hasChildren,rowCount,columnCount以及其他一些只读方法,以检查这些驱动器的模型。因此,如果模型需要知道C:/
是否有子项,那么您的hasChildren()
必须查找该索引到隐藏C:/
根模型的映射,并进行子计数在那个模型上。
另一种方法是仅将QStandardItemModel
(或QAbstractItemModel
)子类化并自行执行文件系统列表,而不是使用QFileSystemModel
。这将允许您只设置固定的根项目,类别和驱动器号,然后在列表展开或折叠时检查列表。同样,这将需要子类化一个并不总是很好的初学者Qt经验的模型。
答案 1 :(得分:0)
如果我误解了你的问题,请原谅我,但我认为你正在寻找类似于this
的东西