qml中的ListView官方的例子里代理只能代理(delegate)一种组件,但很多时候我们的布局需要多种组件,则需要ListView代理多种组件。
这里的方法主要是用了一个博主的博客
链接
,这里我们需要将ListModuel与delegate分开成两个qml文件,然后在第三个qml文件用ListView去调用他们。
// ListModuel部分,注意是写在第一个qml文件中,Myitem.qml
ListModel {
id: dataBank
ListElement {
value: "qrc:/new/prefix1/Image/obama2.jpg"
type: "image"
ListElement {
value: "Dummy text 1"
type: "text"
ListElement {
value: "qrc:/new/prefix1/Image/obama2.jpg"
type: "image"
ListElement {
value: "Dummy text 2"
type: "text"
// delegate部分,注意是写在第二个qml文件中,Test2.qml
Item {
id: multiDelegate
height: {
if(type==="image"){
else{
} //实现不同代理有不同高度的Item
// width: multiDelegate.ListView.view.width-20
anchors.left: parent.left
anchors.right: parent.right
anchors.leftMargin: 10
anchors.rightMargin: 10
function bestDelegate(t) {
if(t === "image")
return imgDelegate;
return txtDelegate; // t == "text"
Component {
id: imgDelegate
Rectangle{
// width: parent.width
// height: 100
radius: 10
color: "green"
Image {
id: img
source: value
fillMode: Image.PreserveAspectFit
asynchronous: true
anchors.fill: parent
Component {
id: txtDelegate
Rectangle{
// width: parent.width
// height: 300
radius: 10
color: "red"
Text {
id: txt
text: value
verticalAlignment: Text.AlignVCenter
horizontalAlignment: Text.AlignHCenter
anchors.centerIn: parent
Loader {
id: itemDisplay
anchors.fill: parent;
anchors.topMargin: 2
anchors.bottomMargin: 2
sourceComponent: bestDelegate(type)
// 最后第三个文件中ListView调用他们
ListView {
id: dataView
height: contentHeight
anchors.fill: parent
spacing: 20
model: Myitem{}
delegate: Test2{}
WebView{
id: webVie1;
anchors.fill: parent;
url: "xxxx"
看代码就知道主要是先在ListModuel设置type,然后自定义一个函数通过不同的参数用Loader加载不同的组件。这里我还在Item的height属性上加了一个判断,让不同的type组件有不同的高度。
qml中的ListView官方的例子里代理只能代理(delegate)一种组件,但很多时候我们的布局需要多种组件,则需要ListView代理多种组件。这里的方法主要是用了一个博主的博客链接,这里我们需要将ListModuel与delegate分开成两个qml文件,然后在第三个qml文件用ListView去调用他们。// ListModuel部分,注意是写在第一个qml文件中,Myitem.qmlListModel { id: dataBank ListElement {
在Qt Quick 中,我们以 ListView 为例,创建一个最简单的列表窗口,为了清晰,去掉了鼠标按键的操作,去掉了高亮的显示,只将数据简单以列表方式显示出来,相当与Hello World 版的 ListView 吧。
版本1:直接在 ListView 内部定义model及delegate
Window {
width: 200
height: 100
visi...
ListView的用法
ListElement定义了单元属性,这些属性是ListModel和delegate通信的基础
ListModel动态添加元素时,需要给定的ListElement中定义的属性。
delegate中显示元素也是引用ListElement中的属性。
ListView的delegate有两种方式。
第一种方式:直接定义delegate。
importQtQ
class FilelistModel : public QStandardItemModel
class ItemDelegate : public QItemDelegate
filelistModel = new FilelistModel(this);
ui->Lst_0015_browsing_...
QML中ListView和TableView使用delegate的区别
ListView中的代理是代理一行,比如在使用ItemDelegate时,我们往往会在ItemDelegate中创建一个完整的自定义布局。
而在使用TableView时,代理会应用到所有的单元格中。假设每个单元格中的控件是不一样的,那我们在设计代理时,需要把所有会用到的控件都添加到一个容器里,比如Item,ItemDelegate,Rectange,然后根据column控制各列控件的visible,这样就可以让各个列显示自己需要的控件形
这是在之前的文章中增加了对每一个ListView中Item的编辑,在Delegate中修改即可,因为考虑到会动态增加个数,所以在实现Delegate时还是用了ListView,这是一个ListView嵌套ListView的例子。
Delegate的代码:
Component {
id: main_view_delegate
ListVie使用要点
ListView可以用来显示条目列表,使用MVC设计模式,条目中的数据对应Model,每个条目的外观对应Delegate,控制器是中间人,负责连接Model和View。
QAbstarctItemModel是Model类的父类。
QAbstractItemView是View类的父类。
QAbstractItemDelegate是Delegate类的父类。
ListView是一个数据列表,列表对应的数据来自Model,每个条目的外观有Delegate决定。
ListView
在 QML 中,ListView 可以使用多种不同的代理来显示列表中的每个项目。以下是几种常见的代理类型:
1. ItemDelegate:使用自定义 ItemDelegate 作为代理,可以自定义每个项目的外观和交互。
2. TextDelegate:使用 Text 组件作为代理,可以在列表中显示简单的文本内容。
3. RectangleDelegate:使用矩形作为代理,可以自定义每个项目的颜色、大小和形状。
4. ImageDelegate:使用 Image 组件作为代理,可以在列表中显示图片。
5. ComponentDelegate:使用自定义的 QML 组件作为代理,可以实现更高级的功能和交互。
在 ListView 中指定代理类型的方法是通过设置 delegate 属性,例如:
ListView {
delegate: ItemDelegate {
// 自定义代理的属性和行为
你可以根据需要选择不同的代理类型,并使用 QML 中提供的各种组件和属性来自定义每个项目的外观和交互。