【问题标题】:Qt: Display Filesystem in A Customized Way inside QTreeViewQt:在 QTreeView 中以自定义方式显示文件系统
【发布时间】:2013-01-19 07:38:03
【问题描述】:

我正在开发 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

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

【问题讨论】:

  • 您甚至没有使用您的pSystemSecondaryModel,所以您实际上只有一个QStandardItemModel 和您手动添加的驱动器条目。
  • @jdi:是的,你是对的,但如果我将pSystemSecondaryModel 设置为setModel(),那么它会显示每行中的所有驱动器,这是我不想要的。

标签: c++ qt qt4 filesystems


【解决方案1】:

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

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

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

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

【讨论】:

  • 非常感谢。我真的很感激 :) 遗憾的是我是这个 Qt 世界的新手。我仍然不确定如何继续进行。你能帮帮我吗?一个示例代码或其他东西真的很有帮助
  • 我试图避免使用示例代码,因为它有点牵涉 :-) 如果您可以在 python 中看到一个示例,我在 pyqt 上的速度要快得多,并且愿意展示一些粗略的部分代码。
  • 好吧,如果你能用python解释一下,我会知道的:)请
  • 不幸的是,举个例子并不简单:-/它需要一些自定义模型功能。
  • :这对我来说确实很难。我实际上在考虑第二种方法,它基本上是对 QStandardItemModel 进行子类化,但我又对此一无所知:(
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2014-05-06
    • 2018-01-12
    • 1970-01-01
    • 2023-03-20
    • 2016-09-23
    • 2017-06-26
    • 1970-01-01
    • 2019-09-23
    • 1970-01-01
    相关资源
    最近更新 更多