我正在制作一个简单的文件浏览器,但Qt遇到了一些问题。我想向用户展示他计算机上文件的树状视图,但是我也希望能够选择多个文件/目录,并在以后对它们进行一些处理(通过选择checkboxes或使用ctrl +左键单击或Shift +左键)。我已经放置了QTreeView元素并为其建立了模型(QFileSystemModel)。它给了我很好的树状视图,但是我不能修改标题(列名),也不能在每行中添加带有checkbox的自己的列(例如)。 Qt对我来说是新手,我已经搜索了好几个小时的一些技巧/解决方案,但QFileSystemModel却无济于事。有什么我可以做的工作吗?

代码简短明了:

QString lPath = "C:/";
QString rPath = "C:/";
leftTree_model = new QFileSystemModel(this);
rightTree_model = new QFileSystemModel(this);

leftTree_model->setRootPath(lPath);
rightTree_model->setRootPath(rPath);

//i have actually 2 tree views that work the same
ui->leftTree->setModel(leftTree_model); //ui->leftTree is the first tree view
ui->rightTree->setModel(rightTree_model); //the second

最佳答案

使用以下内容:

CheckStateRole将复选框添加到模型中。为此,您将从QFileSystemModel继承自定义项目模型(将要使用),并重新实现data()方法,在该方法中为bool返回CheckStateRole值。您还需要QAbstractItemModel::setData方法来处理更改。您还可以检查docs for QAbstractItemModel以查看如何更改标题文本(headerData()

更改视图的selection mode以允许多项选择

编辑:
这是从模型继承的示例代码

  class MyFancyModel : public QFileSystemModel
  {
  public:
    MyFancyModel(QObject* pParent = NULL) : QFileSystemModel(pParent)
    {
    }

    QVariant data(const QModelIndex & index, int role = Qt::DisplayRole ) const
    {
      if (role == Qt::CheckStateRole)
      {
        // stub value is true
        return true;  // here you will return real values
                      // depending on which item is currently checked
      }
      return QFileSystemModel::data(index, role);
    }
  };

10-04 20:38