Qt 自定义分页控件的实现

 更新时间:2023年11月10日 09:35:08   作者:凝望星辰  
在应用程序开发时经常会遇到数据分页的需求,每一页展示特定数量的数据,通过点击按钮翻页或者输入页码跳转到指定页,本文就来介绍一下Qt 自定义分页控件的实现,感兴趣的可以了解一下

前言

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

1、功能描述

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

2、代码实现

2.1 ui文件

本分页控件采用ui文件来布局内部的组件,具体布局如下图所示:

2.2 头文件

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

#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.3 源码文件

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.4 设计思路

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

3、示例

下面这个示例代码演示了如何使用该分页控件。分页控件一般与列表或表格结合使用,当页码改变时更新列表或表格中的数据。下面以分页列表为例来展示,新建一个设计师界面类,命名为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();
}

效果:

4、总结

到此这篇关于Qt 自定义分页控件的实现的文章就介绍到这了,更多相关Qt 自定义分页控件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言实现洗牌与发牌游戏

    C语言实现洗牌与发牌游戏

    这篇文章主要为大家详细介绍了C语言洗牌与发牌游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • C语言实现小型工资管理系统

    C语言实现小型工资管理系统

    这篇文章主要为大家详细介绍了C语言实现小型工资管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • C++结构体字节对齐和共用体大小

    C++结构体字节对齐和共用体大小

    这篇文章主要介绍了C++结构体字节对齐和共用体大小,结构体内存对齐在笔试和面试中经常被问到,所以这篇文章做个总结,首先通过代码验证不同结构体的内存大小,需要的朋友可以参考下
    2021-11-11
  • C++实现LeetCode(49.群组错位词)

    C++实现LeetCode(49.群组错位词)

    这篇文章主要介绍了C++实现LeetCode(49.群组错位词),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C++11中多线程编程-std::async的深入讲解

    C++11中多线程编程-std::async的深入讲解

    这篇文章主要给大家介绍了关于C++11中多线程编程-std::async的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • C++使用ifstream读取文件内容的示例详解

    C++使用ifstream读取文件内容的示例详解

    这篇文章主要为大家详细介绍了C++如何使用ifstream读取文件内容的功能,文中的示例代码讲解详细,具有一定的参考价值,感兴趣的可以了解一下
    2023-03-03
  • C语言实现访问及查询MySQL数据库的方法

    C语言实现访问及查询MySQL数据库的方法

    这篇文章主要介绍了C语言实现访问及查询MySQL数据库的方法,涉及C语言基于libmysql.lib实现访问MySQL数据库的相关操作技巧,需要的朋友可以参考下
    2018-01-01
  • C语言 联合(union)用法案例详解

    C语言 联合(union)用法案例详解

    这篇文章主要介绍了C语言 联合(union)用法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Qt5.9程序打包发布的实现

    Qt5.9程序打包发布的实现

    本文主要介绍了Qt5.9程序打包发布的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 使用c++实现OpenCV绘制圆端矩形

    使用c++实现OpenCV绘制圆端矩形

    这篇文章主要介绍了使用c++实现OpenCV绘制圆端矩形,其中着重的讲解了OpenCV使用过程中需要注意的一些小细节,避免浪费大家在开发过程中浪费多余的时间
    2021-08-08

最新评论