Qt 自定義分頁控件的實(shí)現(xiàn)
前言
在應(yīng)用程序開發(fā)時(shí)經(jīng)常會遇到數(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)文章
C語言實(shí)現(xiàn)小型工資管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)小型工資管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02C++結(jié)構(gòu)體字節(jié)對齊和共用體大小
這篇文章主要介紹了C++結(jié)構(gòu)體字節(jié)對齊和共用體大小,結(jié)構(gòu)體內(nèi)存對齊在筆試和面試中經(jīng)常被問到,所以這篇文章做個(gè)總結(jié),首先通過代碼驗(yàn)證不同結(jié)構(gòu)體的內(nèi)存大小,需要的朋友可以參考下2021-11-11C++實(shí)現(xiàn)LeetCode(49.群組錯(cuò)位詞)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(49.群組錯(cuò)位詞),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C語言實(shí)現(xiàn)訪問及查詢MySQL數(shù)據(jù)庫的方法
這篇文章主要介紹了C語言實(shí)現(xiàn)訪問及查詢MySQL數(shù)據(jù)庫的方法,涉及C語言基于libmysql.lib實(shí)現(xiàn)訪問MySQL數(shù)據(jù)庫的相關(guān)操作技巧,需要的朋友可以參考下2018-01-01使用c++實(shí)現(xiàn)OpenCV繪制圓端矩形
這篇文章主要介紹了使用c++實(shí)現(xiàn)OpenCV繪制圓端矩形,其中著重的講解了OpenCV使用過程中需要注意的一些小細(xì)節(jié),避免浪費(fèi)大家在開發(fā)過程中浪費(fèi)多余的時(shí)間2021-08-08