import QtQuick import QtQuick.Controls import QtQuick.Layouts import FluentUI Item { id:control property var columns : [] property var dataSource : [] property int pageCurrent: 1 property int itemCount: 1000 property int pageCount: 10 property int itemHeight: 56 signal requestPage(int page,int count) implicitHeight: layout_coumns.height + layout_table.height MouseArea{ anchors.fill: parent preventStealing: true } ListModel{ id:model_coumns } ListModel{ id:model_data_source } onColumnsChanged: { model_coumns.clear() model_coumns.append(columns) } onDataSourceChanged: { model_data_source.clear() model_data_source.append(dataSource) } FluRectangle{ id:layout_coumns height: control.itemHeight width: parent.width color:FluTheme.dark ? Qt.rgba(50/255,50/255,50/255,1) : Qt.rgba(247/255,247/255,247/255,1) radius: [12,12,0,0] Row{ id:list_coumns spacing: 0 anchors.fill: parent Repeater{ model: model_coumns delegate: Item{ height: list_coumns.height width: model.width FluText{ text:model.title anchors{ verticalCenter: parent.verticalCenter left: parent.left leftMargin: 14 } fontStyle: FluText.BodyStrong } FluDivider{ width: 1 height: 40 anchors.right: parent.right anchors.verticalCenter: parent.verticalCenter visible: index !== list_coumns.count-1 } } } } } Rectangle{ anchors.fill: layout_table color: FluTheme.dark ? Qt.rgba(39/255,39/255,39/255,1) : Qt.rgba(251/255,251/255,253/255,1) } ListView{ id:layout_table anchors{ top: layout_coumns.bottom left: parent.left right: parent.right } height: contentHeight clip:true footer: Item{ height: 50 width: layout_table.width FluPagination{ id:pagination height: 40 pageCurrent: control.pageCurrent itemCount: control.itemCount pageCount: control.pageCount onRequestPage: (page,count)=> { control.requestPage(page,count) } anchors{ verticalCenter: parent.verticalCenter right: parent.right } } } model:model_data_source delegate: Item{ height: list_coumns.height width: layout_table.width property var model_values : getObjectValues(index) property var itemObject: getObject(index) property var listModel: model Row{ spacing: 0 anchors.fill: parent Repeater{ model: model_values delegate:Item{ height: list_coumns.height width: modelData.width Loader{ property var model : modelData property var dataModel : listModel property var dataObject : itemObject anchors.fill: parent sourceComponent: { if(model.itemData instanceof Component){ return model.itemData } return com_text } } } } } FluDivider{ width: parent.width height: 1 anchors.right: parent.right anchors.bottom: parent.bottom } } } Component{ id:com_text Item{ MouseArea{ id:item_mouse hoverEnabled: true anchors.fill: parent } FluText{ text:String(model.itemData) width: parent.width - 14 elide: Text.ElideRight anchors{ verticalCenter: parent.verticalCenter left: parent.left leftMargin: 14 } FluTooltip{ visible: item_mouse.containsMouse text:parent.text delay: 1000 } } } } function getObject(index){ return model_data_source.get(index) } function getObjectValues(index) { var obj = model_data_source.get(index) if(!obj) return var data = [] for(var i=0;i