在TableView中委托FolderListModel

问题描述:

我正在学习使用Qt Quick来创建文件管理器,但我一般没有QML或GUI的经验。第一步是使用FolderListModel列出文件夹的内容。我得到example code工作使用ListView,但自然我想显示多个字段除了名称,例如大小,时间等等。因此,我正在考虑使用TableView在TableView中委托FolderListModel

但是,我不清楚如何将每个条目委托为TableView中的一行。目前,我只是简单地使用itemDelegate来显示fileName,结果是在每一行中,所有列重复条目的名称。所以我认为rowDelegate是正确的方法,但是如何为此目的制定合适的代表Component?从概念上说,我想指定一个字段数组,例如对应于表格列的[model.fileName, model.fileSize]。这是可以实现的吗?

为了澄清我张贴下面的代码:

import QtQuick 2.4 
import QtQuick.Controls 1.4 
import QtQuick.Dialogs 1.2 
import QtQuick.Layouts 1.1 
import Qt.labs.folderlistmodel 2.1 

ApplicationWindow { 
    visible: true 
    width: 900 
    height: 600 
    title: qsTr("Hello World") 

    Item { 
     anchors.fill: parent 

     width: 900 
     height: 600 

     SplitView { 
      id: splitView1 
      anchors.fill: parent 

      TabView { 
       id: tabView1 
       width: splitView1.width/2 

       Tab { 
        title: qsTr("Home") 

        TableView { 
         id: tableView1 
         width: splitView1.width/2 

         TableViewColumn { 
          role: "name" 
          title: qsTr("Name") 
          width: tableView1.width * 0.75 
         } 

         TableViewColumn { 
          role: "size" 
          title: qsTr("Size") 
          width: tableView1.width * 0.25 
         } 

         FolderListModel { 
          id: folderModel2 
          folder: "file:/home/username" 
          nameFilters: ["*"] 
          showHidden: true 

         } 

         Component { 
          id: fileDelegate2 
          Text { 
           text: model.fileName 
          } 
         } 

         model: folderModel2 
         itemDelegate: fileDelegate2 
        } 
       } 
      } 
     } 
    } 
} 

documentation提到了以下角色可用:

  • 列表项
  • 文件名
  • 文件路径
  • fileURL(自Qt 5.2开始)
  • fileBaseName
  • fileSuffix
  • 档案大小
  • 修改的文件
  • fileAccessed
  • fileIsDir

所以你不需要定制代表显示该信息,只需设置roleTableViewColumn的性质:

import QtQuick 2.4 
import QtQuick.Controls 1.4 
import QtQuick.Dialogs 1.2 
import QtQuick.Layouts 1.1 
import Qt.labs.folderlistmodel 2.1 

ApplicationWindow { 
    visible: true 
    width: 900 
    height: 600 
    title: qsTr("Hello World") 

    Item { 
     anchors.fill: parent 

     width: 900 
     height: 600 

     SplitView { 
      id: splitView1 
      anchors.fill: parent 

      TabView { 
       id: tabView1 
       width: splitView1.width/2 

       Tab { 
        title: qsTr("Home") 

        TableView { 
         id: tableView1 
         width: splitView1.width/2 

         TableViewColumn { 
          role: "fileName" 
          title: qsTr("Name") 
          width: tableView1.width * 0.75 
         } 

         TableViewColumn { 
          role: "fileSize" 
          title: qsTr("Size") 
          width: tableView1.width * 0.25 
         } 

         FolderListModel { 
          id: folderModel2 
          folder: "file:/home/username" 
          nameFilters: ["*"] 
          showHidden: true 

         } 

         model: folderModel2 
        } 
       } 
      } 
     } 
    } 
}