Qt 自定義分頁控件的實(shí)現(xiàn)
前言
在應(yīng)用程序開發(fā)時(shí)經(jīng)常會(huì)遇到數(shù)據(jù)分頁的需求,每一頁展示特定數(shù)量的數(shù)據(jù),通過點(diǎn)擊按鈕翻頁或者輸入頁碼跳轉(zhuǎn)到指定頁。 本文介紹一個(gè)自定義分頁控件,基本上實(shí)現(xiàn)了作為一個(gè)分頁控件該有的功能。
1、功能描述
本分頁控件支持顯示總頁數(shù),支持顯示當(dāng)前頁碼,支持跳轉(zhuǎn)到指定頁,支持上一頁和下一頁,支持首頁和尾頁,支持顯示每頁數(shù)量,支持?jǐn)?shù)據(jù)總量顯示。
2、代碼實(shí)現(xiàn)
2.1 ui文件
本分頁控件采用ui文件來布局內(nèi)部的組件,具體布局如下圖所示:

2.2 頭文件
頭文件中每個(gè)方法都作了注釋,一眼就能明白其功能。
#include <QWidget>
namespace Ui {
class ZPageWidget;
}
class ZPageWidget : public QWidget
{
Q_OBJECT
public:
explicit ZPageWidget(QWidget *parent = nullptr);
~ZPageWidget();
/**
* @brief setPageCount 設(shè)置總頁數(shù)
* @param count 總頁數(shù)
*/
void setPageCount(int count);
int pageCount() const { return m_pageCount; }
/**
* @brief setCurrentPage 設(shè)置當(dāng)前頁
* @param page 當(dāng)前頁碼
*/
void setCurrentPage(int page);
int currentPage() const{ return m_currentPage; }
/**
* @brief setDataCount 設(shè)置數(shù)據(jù)總量
* @param cnt 數(shù)據(jù)總量
*/
void setDataCount(int cnt);
int dataCount() const { return m_dataCount; }
/**
* @brief setPerpageDataCount 設(shè)置每頁數(shù)據(jù)量
* @param cnt 每頁數(shù)據(jù)量
*/
void setPerpageDataCount(int cnt);
int perpageDataCount() const { return m_perpageDataCount; }
signals:
/**
* @brief sign_pageChanged 頁碼變化信號
* @param page 當(dāng)前頁碼
*/
void sign_pageChanged(int page);
private:
/**
* @brief pageChanged 切換頁碼
*/
void pageChanged();
private slots:
/**
* @brief slot_previousPageBtnClicked 前一頁按鈕槽函數(shù)
*/
void slot_previousPageBtnClicked();
/**
* @brief slot_nextPageBtnClicked 后一頁按鈕槽函數(shù)
*/
void slot_nextPageBtnClicked();
/**
* @brief slot_firstPageBtnClicked 首頁按鈕槽函數(shù)
*/
void slot_firstPageBtnClicked();
/**
* @brief slot_lastPageBtnClicked 尾頁按鈕槽函數(shù)
*/
void slot_lastPageBtnClicked();
/**
* @brief slot_skipPageBtnClicked 跳轉(zhuǎn)頁碼按鈕槽函數(shù)
*/
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("總數(shù)")).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 設(shè)計(jì)思路
該分頁控件的設(shè)計(jì)思路比較簡單清晰,根據(jù)分頁控件支持的功能,將一組QWidget控件封裝在一起,在各個(gè)按鈕槽函數(shù)中重新計(jì)算頁碼,并將當(dāng)前頁碼用信號的方式,傳遞給使用者,完成頁碼與數(shù)據(jù)的同步。
3、示例
下面這個(gè)示例代碼演示了如何使用該分頁控件。分頁控件一般與列表或表格結(jié)合使用,當(dāng)頁碼改變時(shí)更新列表或表格中的數(shù)據(jù)。下面以分頁列表為例來展示,新建一個(gè)設(shè)計(jì)師界面類,命名為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、總結(jié)
到此這篇關(guān)于Qt 自定義分頁控件的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Qt 自定義分頁控件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
自己實(shí)現(xiàn)strcpy函數(shù)的實(shí)現(xiàn)方法
本篇文章介紹了,自己實(shí)現(xiàn)strcpy函數(shù)的實(shí)現(xiàn)方法。需要的朋友參考下2013-05-05
C++對Json數(shù)據(jù)的友好處理實(shí)現(xiàn)過程
在Ajax的應(yīng)用中,前臺基本上會(huì)用到JSON作為數(shù)據(jù)交換格式,所以下面這篇文章主要給大家介紹了關(guān)于C++對Json數(shù)據(jù)的友好處理,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-02-02
C++ OpenCV實(shí)戰(zhàn)之網(wǎng)孔檢測的實(shí)現(xiàn)
這篇文章主要介紹了如何利用C++和OpenCV實(shí)現(xiàn)網(wǎng)孔檢測,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)OpenCV有一定幫助,感興趣的小伙伴可以了解一下2022-05-05
C++條件及循環(huán)語句的綜合運(yùn)用實(shí)例
這篇文章主要介紹了C++條件及循環(huán)語句的綜合運(yùn)用實(shí)例,能夠幫助C++初學(xué)者更好地掌握C++的邏輯語句用法,需要的朋友可以參考下2015-09-09

