Qt 自定义分页控件

目录

    • 前言
    • 1、功能描述
    • 2、代码实现
      • 2.1 ui文件
      • 2.1 头文件
      • 2.2 源码文件
      • 2.3 设计思路
    • 4、示例
    • 5、总结

前言

在应用程序开发时经常会遇到数据分页的需求,每一页展示特定数量的数据,通过点击按钮翻页或者输入页码跳转到指定页。 本文介绍一个自定义分页控件,基本上实现了作为一个分页控件该有的功能。

1、功能描述

本分页控件支持显示总页数,支持显示当前页码,支持跳转到指定页,支持上一页和下一页,支持首页和尾页,支持显示每页数量,支持数据总量显示。

2、代码实现

2.1 ui文件

本分页控件采用ui文件来布局内部的组件,具体布局如下图所示:
在这里插入图片描述

2.1 头文件

头文件中每个方法都作了注释,一眼就能明白其功能。


#include <QWidget>

namespace Ui {
class ZPageWidget;
}

class  ZPageWidget : public QWidget
{
    Q_OBJECT

public:
    explicit ZPageWidget(QWidget *parent = nullptr);
    ~ZPageWidget();

    /**
     * @brief setPageCount 设置总页数
     * @param count 总页数
     */
    void setPageCount(int count);
    int pageCount() const { return m_pageCount; }

    /**
     * @brief setCurrentPage 设置当前页
     * @param page 当前页码
     */
    void setCurrentPage(int page);
    int currentPage() const{ return m_currentPage; }

    /**
     * @brief setDataCount 设置数据总量
     * @param cnt 数据总量
     */
    void setDataCount(int cnt);
    int dataCount() const  { return m_dataCount; }

    /**
     * @brief setPerpageDataCount 设置每页数据量
     * @param cnt 每页数据量
     */
    void setPerpageDataCount(int cnt);
    int perpageDataCount() const  { return m_perpageDataCount; }

signals:
    /**
     * @brief sign_pageChanged 页码变化信号
     * @param page 当前页码
     */
    void sign_pageChanged(int page);

private:
    /**
     * @brief pageChanged 切换页码
     */
    void pageChanged();

private slots:
    /**
     * @brief slot_previousPageBtnClicked 前一页按钮槽函数
     */
    void slot_previousPageBtnClicked();

    /**
     * @brief slot_nextPageBtnClicked 后一页按钮槽函数
     */
    void slot_nextPageBtnClicked();
    /**
     * @brief slot_firstPageBtnClicked 首页按钮槽函数
     */
    void slot_firstPageBtnClicked();
    /**
     * @brief slot_lastPageBtnClicked 尾页按钮槽函数
     */
    void slot_lastPageBtnClicked();

    /**
     * @brief slot_skipPageBtnClicked 跳转页码按钮槽函数
     */
    void slot_skipPageBtnClicked();

private:
    Ui::ZPageWidget *ui;

    int m_pageCount;
    int m_currentPage;
    int m_dataCount;
    int m_perpageDataCount;
};

2.2 源码文件


ZPageWidget::ZPageWidget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::ZPageWidget)
    , m_pageCount(1)
    , m_currentPage(1)
{
    ui->setupUi(this);

    ui->lineEdit->setValidator(new QRegExpValidator(QRegExp("[0-9]+$")));

    connect(ui->btn_previous, SIGNAL(clicked()), this, SLOT(slot_previousPageBtnClicked()));
    connect(ui->btn_next, SIGNAL(clicked()), this, SLOT(slot_nextPageBtnClicked()));
    connect(ui->btn_first, SIGNAL(clicked()), this, SLOT(slot_firstPageBtnClicked()));
    connect(ui->btn_last, SIGNAL(clicked()), this, SLOT(slot_lastPageBtnClicked()));
    connect(ui->btn_skip, SIGNAL(clicked()), this, SLOT(slot_skipPageBtnClicked()));
}

ZPageWidget::~ZPageWidget()
{
    delete ui;
}

void ZPageWidget::setPageCount(int count)
{
    m_pageCount = count;
    m_pageCount = m_pageCount > 0 ? m_pageCount : 1;
    if(m_currentPage > m_pageCount)
    {
        m_currentPage = m_pageCount;
    }

    pageChanged();
}

void ZPageWidget::setCurrentPage(int page)
{
    m_currentPage = page;
}

void ZPageWidget::setDataCount(int cnt)
{
    m_dataCount = cnt;
    ui->lb_totalData->setText(QString("%1:%2").arg(QString::fromLocal8Bit("总数")).arg(cnt));
}

void ZPageWidget::setPerpageDataCount(int cnt)
{
    m_perpageDataCount = cnt;
    ui->lb_perPageData->setText(QString("%1:%2").arg(QString::fromLocal8Bit("每页")).arg(cnt));
}

void ZPageWidget::pageChanged()
{
    emit sign_pageChanged(m_currentPage);
    ui->lb_pageInfo->setText(QString("%1/%2").arg(m_currentPage).arg(m_pageCount));
}

void ZPageWidget::slot_previousPageBtnClicked()
{
    if(m_currentPage > 1)
    {
        m_currentPage--;
        pageChanged();
    }
}

void ZPageWidget::slot_nextPageBtnClicked()
{
    if(m_currentPage < m_pageCount)
    {
        m_currentPage++;
        pageChanged();
    }
}

void ZPageWidget::slot_firstPageBtnClicked()
{
    if(m_currentPage != 1)
    {
        m_currentPage = 1;
        pageChanged();
    }
}

void ZPageWidget::slot_lastPageBtnClicked()
{
    if(m_pageCount != m_currentPage)
    {
        m_currentPage = m_pageCount;
        pageChanged();
    }
}

void ZPageWidget::slot_skipPageBtnClicked()
{
    int page = ui->lineEdit->text().toInt();
    ui->lineEdit->clear();
    if(page > 0 && page <= m_pageCount)
    {
        m_currentPage = page;
        pageChanged();
    }
}

2.3 设计思路

该分页控件的设计思路比较简单清晰,根据分页控件支持的功能,将一组QWidget控件封装在一起,在各个按钮槽函数中重新计算页码,并将当前页码用信号的方式,传递给使用者,完成页码与数据的同步。

4、示例

下面这个示例代码演示了如何使用该分页控件。分页控件一般与列表或表格结合使用,当页码改变时更新列表或表格中的数据。下面以分页列表为例来展示,新建一个设计师界面类,命名为PageControlTest,ui文件如下图所示:
在这里插入图片描述

测试代码:


PageControlTest::PageControlTest(QWidget *parent) :
                                                    QWidget(parent),
                                                    ui(new Ui::PageControlTest)
{
    ui->setupUi(this);

    m_dataList << QString::fromLocal8Bit("1") << QString::fromLocal8Bit("2") << QString::fromLocal8Bit("3")
               << QString::fromLocal8Bit("4") << QString::fromLocal8Bit("5") << QString::fromLocal8Bit("6")
               << QString::fromLocal8Bit("7") << QString::fromLocal8Bit("8") << QString::fromLocal8Bit("9")
               << QString::fromLocal8Bit("10") << QString::fromLocal8Bit("11") << QString::fromLocal8Bit("12")
               << QString::fromLocal8Bit("13");

    int perpageCnt = 10;
    ui->pageWidget->setPerpageDataCount(perpageCnt);
    ui->pageWidget->setDataCount(m_dataList.size());

    connect(ui->pageWidget, SIGNAL(sign_pageChanged(int)), this, SLOT(slot_pageChanged(int)));
    int pageCount = ceil(m_dataList.size() / (double)perpageCnt);
    ui->pageWidget->setPageCount(pageCount);

}

void PageControlTest::loadData()
{
    int offset = ui->pageWidget->perpageDataCount() * (ui->pageWidget->currentPage() - 1);
    QStringList currPageDataList = m_dataList.mid(offset, ui->pageWidget->perpageDataCount());

    ui->listWidget->clear();
    for (int var = 0; var < currPageDataList.size(); ++var)
    {
        ui->listWidget->addItem(currPageDataList[var]);
    }
}

void PageControlTest::slot_pageChanged(int page)
{
    loadData();
}

效果:
在这里插入图片描述

5、总结

以上就是本文的所有内容了,本文实现了一个自定义分页控件,并给出一个使用示例。对此有任何疑问欢迎留言讨论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/126382.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Spring】静态代理

例子&#xff1a; 租房子 角色&#xff1a; 我 &#xff08;I ) 中介( Proxy ) 房东( host ) Rent 接口 package org.example;public interface Rent {void rent(); }房东 package org.example;public class Host implements Rent{Overridepublic void rent() …

立体相机标定

相机成像过程中涉及的4个坐标系&#xff1a; 1、世界坐标系&#xff1a;由用户定义的三维世界坐标系&#xff0c;描述物体和相机在真实世界中的位置&#xff0c;原点可以任意选择。 2、相机坐标系&#xff1a;以相机的光心为坐标原点&#xff0c;X轴和Y轴平行于图像坐标系的X轴…

uniapp实现在线PDF文件预览

下载pdf文件放在static文件夹下 bug&#xff1a;hbuildX创建的项目pdf文件夹可以放在根目录下面&#xff0c;但是cli创建的项目无法预览&#xff0c;只能放在static下面 按钮跳转预览页面 <button click"toPdf">pdf</button>methods: {toPdf() {uni.…

接口测试|HttpRunner模拟发送GET请求自动生成测试报告

HttpRunner模拟发送GET请求&自动生成测试报告 前面说到&#xff0c;HttpRunner必须使用yaml或者json文件来进行使用&#xff0c;测试场景文件推荐使用yaml文件进行编辑。 httprunner 项目下yaml文件的格式 在python项目下新建一个 testcases 文件夹&#xff0c;然后再新…

K8s----资源管理

目录 一、Secret 1、创建 Secret 1.1 用kubectl create secret命令创建Secret 1.2 内容用 base64 编码&#xff0c;创建Secret 2、使用方式 2.1 将 Secret 挂载到 Volume 中&#xff0c;以 Volume 的形式挂载到 Pod 的某个目录下 2.2 将 Secret 导出到环境变量中 二、Co…

一文概览NLP句法分析:从理论到PyTorch实战解读

本文全面探讨了自然语言处理&#xff08;NLP&#xff09;中句法分析的理论与实践。从句法和语法的定义&#xff0c;到各类句法理论和方法&#xff0c;文章细致入微地解析了句法分析的多个维度。最后&#xff0c;通过PyTorch的实战演示&#xff0c;我们展示了如何将这些理论应用…

【C++】STL容器适配器——queue类的使用指南(含代码使用)(18)

前言 大家好吖&#xff0c;欢迎来到 YY 滴C系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; 目录 一、queue 类——基本介绍二、queue 类…

Milvus Cloud——Agent 框架工作方式

Agent 框架工作方式 我们以 AutoGPT 为例&#xff0c;看看一个 Agent 框架具体是如何工作的&#xff1a; AutoGPT[2] 使用 GPT-4 来生成任务、确定优先级并执行任务&#xff0c;同时使用插件进行互联网浏览和其他访问。AutoGPT 使用外部记忆来跟踪它正在做什么并提供上下文&am…

(免费领源码)Node.js#koa#MySQL精品课程网站27724-计算机毕业设计项目选题推荐

目 录 摘要 1 绪论 1.1研究背景 1.2研究现状及意义 1.3koa框架 1.4论文结构与章节安排 2精品课程网站系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1数据增加流程 2.3.2数据修改流程 2.3.3数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析…

如何捕捉牛熊转变的信号,澳福认为只需了解一个模式

在过去的交易市场&#xff0c;当所有的多头都买了&#xff0c;没有新的买家时&#xff0c;牛市就结束了。但是在今天的交易市场&#xff0c;激进的卖空者也会出现在趋势的顶部&#xff0c;澳福知道这个事实会改变重要趋势结束时的市场行为。当多头让位于空头时&#xff0c;牛市…

计蒜客详解合集(1)期

以后对于简单题目&#xff0c;大致6道题目出一期&#xff0c;稍有难度的才单独一期发布~ 目录 T1266——出勤记录 T1170——人民币支付 T1122——最长最短单词 T1115——字符串判等 T1116——验证子串 T1118——删除单词后缀 T1266——出勤记录 小蒜的算法课老师每次…

向量的范数、矩阵的范数

向量的范数 p-范数 常用的0-范数、1-范数、2-范数、无穷-范数其实都是p-范数的特殊情形。 0-范数 当p0时&#xff0c;表示0-范数。它比较特殊&#xff0c;本质是一种计数&#xff0c;表示向量中非0元素的个数。 1-范数&#xff08;也称L1范数&#xff09; 当p1时&#xff…

软件开发项目文档系列之十五如何撰写项目结项报告

这是一个项目总结文档的说明文件&#xff0c;它提供了项目的概述、建设情况、技术情况、测试情况、培训情况、试运行情况、主要成效等详细信息。 1 项目概述 项目名称&#xff1a;明确指定了项目的名称&#xff0c;这有助于确保文件的清晰性和易读性。 项目相关单位&#xff…

读写锁ReentrantReadWriteLock

读写锁ReentrantReadWriteLock是JDK1.5提供的一个工具锁&#xff0c;适用于读多写少的场景&#xff0c;将读写分离&#xff0c;从而提高并发性。读写锁允许的情况&#xff1a;一个资源可以被多个读操作访问&#xff0c;或者被一个写操作访问&#xff0c;但两者不能同时进行。 R…

【广州华锐互动】VR安防网络综合布线仿真实训打造沉浸式的教学体验

随着科技的快速发展&#xff0c;综合布线技术在建筑、数据中心、网络基础设施等领域的应用越来越广泛。为了适应这一趋势&#xff0c;传统的教学方法已经无法满足现代教育的需求。因此&#xff0c;采用创新的教学手段&#xff0c;如虚拟现实&#xff08;VR&#xff09;技术&…

【Python 千题 —— 基础篇】菜品的价格

题目描述 题目描述 食堂今天准备了很多好吃的菜。“beef” 12 元一份&#xff1b;“rice” 1 元一份&#xff1b;“fish” 8 元一份&#xff1b;其它菜品 5 元一份。请你根据输入的字符串&#xff0c;使用 if-elif-else 语句判断该菜品需要花费多少钱。 输入描述 输入一个菜…

【被面试官吊打系列】啥,你没说面试要考智力题呀 (上) ?

你好&#xff0c;我是安然无虞。 文章目录 1. 二进制问题分金条问题毒药问题 2. 先手必胜问题轮流拿石子抢30的必胜策略Nim游戏 3. 水桶问题5L和6L的水桶怎么量出3L的水&#xff1f;3L和5L的水桶怎么量出4L的水&#xff1f;一个装了10L水的桶&#xff0c;一个7L的空桶还有一个…

Windows搭建minio存储

minio功能类似以ftp 小白教程&#xff0c;一看就会&#xff0c;一做就成。 1.下载软件 https://dl.min.io/server/minio/release/windows-amd64/minio.exe 2.部署配置 我是在D盘下创建了minio目录 minio.exe是软件minio.log是日志&#xff08;不用创建&#xff09;minio900…

借钱正成为互联网一大坑,影响你的房贷,悄悄吞噬消费者

如今各个APP都可以给消费者提供贷款&#xff0c;由于网贷已坑了不少人&#xff0c;许多用户都选择了拒绝&#xff0c;不过APP的另一大坑却在悄悄影响消费者的征信&#xff0c;对消费者包括房贷在内的贷款产生影响。 互联网的这个坑就是先用后付功能&#xff0c;表面上各个APP以…

Node.js中的文件系统(file system)模块

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…