qt qml 创建分页组件
创建组件MyPagination
import QtQuick 2.12
import QtQuick.Controls 2.12
Item {
id: pagination
property int currentPage: 1
property int pageSize: 10
property int totalItems: 100
property int visiblePages: 3 // 可见的页码数量
function nextPage() {
if (currentPage < maxPage + 1) {
currentPage++;
updateModel();
}
}
function previousPage() {
if (currentPage > 1) {
currentPage--;
updateModel();
}
}
function goToPage(page) {
if (page >= 0 && page <= maxPage) {
currentPage = page;
lbl.text = currentPage.toString();
updateModel();
}
}
function updateModel() {
// 更新model数据的逻辑,这里仅仅输出当前页的内容作为示例
var startIndex = currentPage * pageSize;
var endIndex = Math.min(startIndex + pageSize, totalItems) - 1;
lbl.text = currentPage.toString();
console.log("Current Page:", currentPage);
console.log("Start Index:", startIndex);
console.log("End Index:", endIndex);
}
function reset() {
currentPage = 0;
updateModel();
}
function getMaxPage() {
return Math.ceil(totalItems / pageSize) - 1;
}
property int maxPage: getMaxPage()
Row {
spacing: 10
Text {
id: lbl
text: qsTr("text")
color: "white"
}
//前进一页
Button {
text: "<"
onClicked: pagination.previousPage()
}
// 首页按钮
Button {
text: "1"
onClicked: {
currentPage = 1;
lbl.text = currentPage.toString();
}
}
// 左边省略号折叠按钮
Button {
text: "..."
visible: currentPage > 3
onClicked: {
currentPage = currentPage - visiblePages < 0 ? 1 : currentPage - visiblePages
}
}
// 页码按钮
Repeater {
model: maxPage > 1 ? maxPage - 1 : 0
delegate: Button {
text: (index + 2).toString()
visible:(index + 2) === currentPage || Math.abs(index + 2 - currentPage) <= 1
onClicked: {
pagination.goToPage(index + 2)
}
}
}
// 右边省略号折叠按钮
Button {
text: "..."
visible: currentPage < maxPage - 1
onClicked: {
currentPage = currentPage + visiblePages > maxPage ? maxPage : currentPage + visiblePages
}
}
// 末页按钮
Button {
text: (maxPage + 1).toString()
visible: maxPage + 1 > 1
onClicked: {
currentPage = maxPage + 1;
lbl.text = currentPage.toString();
}
}
Button {
text: ">"
onClicked: pagination.nextPage()
}
}
Component.onCompleted: {
updateModel()
}
}
main.qml中调用
Rectangle {
color: "#13131A"
MyPagination{
id : pagination
pageSize: 10
totalItems: 31
}
}
组件效果: