在 TableView 中委托 FolderListModel
Delegate FolderListModel in TableView
我正在学习 Qt Quick 来制作一个文件管理器,但我没有 QML 或 GUI 的一般经验。第一步是使用 FolderListModel
列出文件夹的内容。我使用 ListView
让 example code 工作,但自然我想显示除名称之外的多个字段,例如大小、时间等。因此,我正在考虑使用 TableView
.
但是,我不清楚如何在 TableView
中将每个条目委托为一行。目前我只是使用 itemDelegate
来显示 fileName
,结果是在每一行中,所有列都重复条目的名称。所以我认为 rowDelegate
是正确的方法,但是我如何为此目的制作一个合适的委托 Component
呢?从概念上讲,我想指定一个字段数组,例如[model.fileName, model.fileSize]
对应于 table 列。这可以实现吗?
为了澄清,我发布了下面的代码:
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提到以下角色可用:
- List item
- fileName
- filePath
- fileURL (since Qt 5.2)
- fileBaseName
- fileSuffix
- fileSize
- fileModified
- fileAccessed
- fileIsDir
因此您不需要自定义委托来显示该信息,只需适当地设置 TableViewColumn
的 role
属性:
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
}
}
}
}
}
}
我正在学习 Qt Quick 来制作一个文件管理器,但我没有 QML 或 GUI 的一般经验。第一步是使用 FolderListModel
列出文件夹的内容。我使用 ListView
让 example code 工作,但自然我想显示除名称之外的多个字段,例如大小、时间等。因此,我正在考虑使用 TableView
.
但是,我不清楚如何在 TableView
中将每个条目委托为一行。目前我只是使用 itemDelegate
来显示 fileName
,结果是在每一行中,所有列都重复条目的名称。所以我认为 rowDelegate
是正确的方法,但是我如何为此目的制作一个合适的委托 Component
呢?从概念上讲,我想指定一个字段数组,例如[model.fileName, model.fileSize]
对应于 table 列。这可以实现吗?
为了澄清,我发布了下面的代码:
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提到以下角色可用:
- List item
- fileName
- filePath
- fileURL (since Qt 5.2)
- fileBaseName
- fileSuffix
- fileSize
- fileModified
- fileAccessed
- fileIsDir
因此您不需要自定义委托来显示该信息,只需适当地设置 TableViewColumn
的 role
属性:
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
}
}
}
}
}
}