qt做的分页控件
介绍
qt做的分页控件
如何使用
创建
Pagination必须基于一个QWidget创建,否则会引发错误。
Pagination* pa = new Pagination(QWidget*);
设置总页数
Pagination需要设置一个总的页数,来初始化页码。
pa->SetTotalItem(count);
设置可选的每页数量
可以通过传给Pagination一个整形数组,来设置每页显示的条目数。
int args[4] = {1, 100, 200, 300};
pa->SetItemPerPage(args, 4);
刷新配置参数
当上面参数设置完成后,需要调用一次Refresh
来刷新配置。
pa->Refresh();
获取当前页数的变化
当Pagination当前的页码发生变化时,会产生一个PageChanged
信号,原型如下:
void PageChanged(int nPage);
其中,nPage代表要跳转的页数。
获取每页条目数的变化
当Pagination的每页数量发生变化时,会产生一个NumberPerPageChanged
信号,原型如下:
void NumberPerPageChanged(int nCount);
其中,nCount表示最新的每页条目数量。
#include "pagination.h"
#include <QPainter>
#include <QStyleOption>
#include <QListView>
#include <QKeyEvent>
//q:303103757 and v:qt5_qt6
Pagination::Pagination(QWidget *parent) :QWidget(parent),m_nCurrentPage(MINIMUM_PAGE),m_nMaxPage(MINIMUM_PAGE),m_nDisplayPage(0)
{setMinimumSize(800, 50);Init();
}Pagination::~Pagination()
{if(m_pHPageLayout){delete m_pHPageLayout;m_pHPageLayout = nullptr;}
}void Pagination::SetTotalItem(int nTotal)
{m_pTotalItem->SetTotal(nTotal);int EachPage = m_pItemEachPage->GetCurrent();if(EachPage > 0){m_nMaxPage = nTotal / EachPage;if(nTotal % EachPage > 0) ++m_nMaxPage;if(m_nMaxPage <= 0) m_nMaxPage = MINIMUM_PAGE;// 如果m_nMaxPage大于MAX_BUTTON_COUNT,则只构建7个按钮,头、尾,中间5个if(m_nMaxPage > MAX_BUTTON_COUNT) m_nDisplayPage = MAX_BUTTON_COUNT + 1;else m_nDisplayPage = m_nMaxPage;}
}void Pagination::SetItemPerPage(int *args, int size)
{m_pItemEachPage->SetItemEachPage(args, size);int EachPage = m_pItemEachPage->GetCurrent();if(EachPage > 0){int nTotal = m_pTotalItem->GetTotal();m_nMaxPage = nTotal / EachPage;if(nTotal % EachPage > 0) ++m_nMaxPage;if(m_nMaxPage <= 0) m_nMaxPage = MINIMUM_PAGE;// 如果m_nMaxPage小于MAX_BUTTON_COUNT,则不变。// 如果m_nMaxPage大于MAX_BUTTON_COUNT,则只构建7个按钮,头、尾,中间5个if(m_nMaxPage > MAX_BUTTON_COUNT) m_nDisplayPage = MAX_BUTTON_COUNT + 1;else m_nDisplayPage = m_nMaxPage;}
}void Pagination::Refresh()
{Reload();
}void Pagination::ChangeView(int currentPage)
{/***************************************************************** 改变页数的几种情形* 1、显示页数(m_nDisplay)小于等于MAX_BUTTON_COUNT,则该函数不做任何处理。* 2、显示页数(m_nDisplay)大于MAX_BUTTON_COUNT,开始处理* (1).初始(currentPage < MAX_BUTTON_COUNT).* ① currentPage != 5, [1] 2 3 4 5 6 ... max* ② currentPage == 5, 此时应当放到(2)去处理,因为此时已经形成 1 ... 3 4 [5]的情况* (2).(currentPage >= MAX_BUTTON_COUNT)。* ① 两个省略号中间(currentPage < max - 3):1 ... 3 4 [5] 6 7 ... max* ② 后省略号后面(currentPage >= max - 3): 1 ... 4 5 [6] 7 8 max* ***************************************************************/if(currentPage == MINIMUM_PAGE)m_pBtnLeft->setDisabled(true); // 当前第一页,禁用左按钮elsem_pBtnLeft->setDisabled(false); // 开启右按钮if(currentPage == m_nMaxPage)m_pBtnRight->setDisabled(true); // 最后一页,禁用右按钮elsem_pBtnRight->setDisabled(false); // 开启左按钮if(m_nDisplayPage <= MAX_BUTTON_COUNT)return; // 1情况if(currentPage < MAX_BUTTON_COUNT && currentPage != MAX_BUTTON_COUNT - 1) // 2.1情况{// 页面情况 1 2 3 4 5 6 ... maxfor(unsigned long long i = 0; i < m_vecPageBtn.size(); i++){QPushButton* btn = m_vecPageBtn[i];if(btn->isHidden()) btn->show();if(i == m_vecPageBtn.size() - 1)btn->setText(QString::number(m_nMaxPage));elsebtn->setText(QString::number(i + 1));btn->adjustSize();if(btn->text().toInt() == currentPage)btn->setChecked(true);elsebtn->setChecked(false);}// 显示后省略号,屏蔽前省略if(!m_pBtnOmitFront->isHidden())m_pBtnOmitFront->hide();if(m_pBtnOmitBack->isHidden())m_pBtnOmitBack->show();}else{if(currentPage < m_nMaxPage - 3) // 2.2.1情况{// 页面情况 currentPage - 2, currentPage - 1, [currentPage], currentPage + 1, currentPage + 2int value = - 2;for(unsigned long long i = 1; i <= 5; i++){QPushButton* btn = m_vecPageBtn[i];btn->setText(QString::number(currentPage + value++));btn->adjustSize();if(btn->text().toInt() == currentPage) btn->setChecked(true);else btn->setChecked(false);}// 开启两边省略号if(m_pBtnOmitFront->isHidden()) m_pBtnOmitFront->show();if(m_pBtnOmitBack->isHidden()) m_pBtnOmitBack->show();}else // 2.2.2情况{// 页面情况 1 ... max - 5, max - 4, [max - 3], max - 2, max - 1, max// 除了第一个不变,其它全变for(unsigned long long i = 1; i < m_vecPageBtn.size(); i++){QPushButton* btn = m_vecPageBtn[i];btn->setText(QString::number(m_nMaxPage - MAX_BUTTON_COUNT + i));btn->adjustSize();if(btn->text().toInt() == currentPage) btn->setChecked(true);else btn->setChecked(false);}// 显示前省略号,屏蔽后省略if(m_pBtnOmitFront->isHidden()) m_pBtnOmitFront->show();if(!m_pBtnOmitBack->isHidden()) m_pBtnOmitBack->hide();}}
}QPushButton *Pagination::GetPageItem(int nPos)
{return dynamic_cast<QPushButton*>(m_pHPageLayout->itemAt(nPos)->widget());
}void Pagination::Init()
{setObjectName("pagination");setStyleSheet(QStringLiteral("QWidget#pagination{background-color:transparent;}"));m_pHMainLayout = new QHBoxLayout(this);m_pHPageLayout = new QHBoxLayout;m_pTotalItem = new TotalItem(this);m_pItemEachPage = new EachPageItem(this);m_pGotoItem = new GotoPageItem(this);m_pBtnLeft = new QPushButton("<", this);m_pBtnRight = new QPushButton(">", this);m_pBtnOmitFront = new QPushButton(this);m_pBtnOmitBack = new QPushButton(this);m_vecPageBtn.reserve(10);m_pBtnOmitFront->setStyleSheet(QStringLiteral("QPushButton{border:none;background-color:transparent;background:url(:/pagination/skin/ellipsis.png) no-repeat;background-position:center;}""QPushButton:hover{background:url(:/pagination/skin/FB.png) no-repeat;background-position:center;}"));m_pBtnOmitBack->setStyleSheet(QStringLiteral("QPushButton{border:none;background-color:transparent;background:url(:/pagination/skin/ellipsis.png) no-repeat;background-position:center;}""QPushButton:hover{background:url(:/pagination/skin/FF.png) no-repeat;background-position:center;}"));m_nCurrentPage = 1;int args[4] = { 100, 200, 300, 400 };SetItemPerPage(args, sizeof (args) / sizeof (int));m_pBtnOmitFront->hide();m_pBtnOmitBack->hide();int btnWidth = 0;for(int i = 0; i < m_nDisplayPage; i++){if(i == 1) m_pHPageLayout->addWidget(m_pBtnOmitFront);if(i == m_nMaxPage - 2 && i != 0) m_pHPageLayout->addWidget(m_pBtnOmitBack);QPushButton* btn = new QPushButton(QString::number(i + 1), this);btn->setCheckable(true);m_pHPageLayout->addWidget(btn);m_vecPageBtn.emplace_back(btn);connect(btn, &QPushButton::clicked, this, &Pagination::btn_page_clicked);btnWidth += btn->width();}for(auto & x : findChildren<QPushButton*>()){x->setMinimumSize(32, 32);x->setCursor(QCursor(Qt::PointingHandCursor));if(x != m_pBtnOmitFront && x != m_pBtnOmitBack){x->setStyleSheet(QStringLiteral("QPushButton{font-size:15px;font-weight:bold;border:none;background-color:transparent;color:black;}""QPushButton:hover{color:#409EFF;}""QPushButton:pressed{color:#409EFF;}""QPushButton:checked{color:#409EFF;}""QPushButton:disabled{color:#BCBEC2;}"));}}ChangeView(m_nCurrentPage);m_pHMainLayout->addWidget(m_pTotalItem);m_pHMainLayout->addWidget(m_pItemEachPage, Qt::AlignCenter);m_pHMainLayout->addWidget(m_pBtnLeft);m_pHMainLayout->addLayout(m_pHPageLayout);m_pHMainLayout->addWidget(m_pBtnRight);m_pHMainLayout->addWidget(m_pGotoItem);m_pHMainLayout->addStretch();// 上一页connect(m_pBtnLeft, &QPushButton::clicked, this, [this](){if(m_nCurrentPage - 1 < 0) m_nCurrentPage = 1;else --m_nCurrentPage;ChangeView(m_nCurrentPage);emit PageChanged(m_nCurrentPage);});// 下一页connect(m_pBtnRight, &QPushButton::clicked, this, [&](){if(m_nCurrentPage + 1 > m_nMaxPage) m_nCurrentPage = m_nMaxPage;else ++m_nCurrentPage;ChangeView(m_nCurrentPage);emit PageChanged(m_nCurrentPage);});// 左省略号,当作快退,即退m_nDisplay页connect(m_pBtnOmitFront, &QPushButton::clicked, this, [&](){if(m_nCurrentPage - PAGE_STEP < MINIMUM_PAGE) m_nCurrentPage = MINIMUM_PAGE;else m_nCurrentPage -= PAGE_STEP;ChangeView(m_nCurrentPage);emit PageChanged(m_nCurrentPage);});// 右省略号,当作快进,即进m_nDisplay页connect(m_pBtnOmitBack, &QPushButton::clicked, this, [&](){if(m_nCurrentPage + PAGE_STEP > m_nMaxPage) m_nCurrentPage = m_nMaxPage;else m_nCurrentPage += PAGE_STEP;ChangeView(m_nCurrentPage);emit PageChanged(m_nCurrentPage);});// 前往第N页connect(m_pGotoItem, &GotoPageItem::GotoPage, this, [&](int nPage){if(nPage > m_nMaxPage) nPage = m_nMaxPage;if(nPage < MINIMUM_PAGE) nPage = MINIMUM_PAGE;if(nPage + 1 > m_nMaxPage) m_nCurrentPage = m_nMaxPage;else m_nCurrentPage = nPage;ChangeView(m_nCurrentPage);emit PageChanged(m_nCurrentPage);});// 每页条码变化connect(m_pItemEachPage, &EachPageItem::EachPageItemChanged, this, [&](int nCount){int EachPage = m_pItemEachPage->GetCurrent();if(EachPage > 0){int nTotal = m_pTotalItem->GetTotal();m_nMaxPage = nTotal / EachPage;if(nTotal % EachPage > 0)++m_nMaxPage;if(m_nMaxPage <= 0)m_nMaxPage = MINIMUM_PAGE;// 如果m_nMaxPage小于MAX_BUTTON_COUNT,则不变。// 如果m_nMaxPage大于MAX_BUTTON_COUNT,则只构建7个按钮,头、尾,中间5个if(m_nMaxPage > MAX_BUTTON_COUNT)m_nDisplayPage = MAX_BUTTON_COUNT + 1;elsem_nDisplayPage = m_nMaxPage;}Reload();emit NumberPerPageChanged(nCount);});
}void Pagination::paintEvent(QPaintEvent *event)
{QStyleOption opt;opt.init(this);QPainter p(this);style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);QWidget::paintEvent(event);
}QPushButton *Pagination::FindPage(int nIndex) const
{for(int i = 0; i < m_pHPageLayout->count(); i++){QLayoutItem* item = m_pHPageLayout->itemAt(i);if(item){QPushButton* btn = qobject_cast<QPushButton*>(item->widget());if(btn && btn->text().compare(QString::number(nIndex)) == 0){return btn;}}}return nullptr;
}void Pagination::ClearPage()
{int sz = m_pHPageLayout->count();for(int i = 0; i < sz; i++){QLayoutItem* item = m_pHPageLayout->takeAt(0);QWidget* tmp = item->widget();m_pHPageLayout->removeWidget(tmp);delete tmp;tmp = nullptr;delete item;item = nullptr;}m_vecPageBtn.clear();
}void Pagination::Reload()
{ClearPage();int lastPage = m_nCurrentPage;m_nCurrentPage = 1;m_pBtnOmitFront = new QPushButton(this);m_pBtnOmitBack = new QPushButton(this);m_pBtnOmitFront->setStyleSheet(QStringLiteral("QPushButton{border:none;background-color:transparent;background:url(:/pagination/skin/ellipsis.png) no-repeat;background-position:center;}""QPushButton:hover{background:url(:/pagination/skin/FB.png) no-repeat;background-position:center;}"));m_pBtnOmitBack->setStyleSheet(QStringLiteral("QPushButton{border:none;background-color:transparent;background:url(:/pagination/skin/ellipsis.png) no-repeat;background-position:center;}""QPushButton:hover{background:url(:/pagination/skin/FF.png) no-repeat;background-position:center;}"));m_pBtnOmitFront->setCursor(QCursor(Qt::PointingHandCursor));m_pBtnOmitBack->setCursor(QCursor(Qt::PointingHandCursor));m_pBtnOmitFront->hide();m_pBtnOmitBack->hide();for(int i = 0; i < m_nDisplayPage; i++){QPushButton* btn = new QPushButton(QString::number(i + 1), this);btn->setCheckable(true);m_pHPageLayout->addWidget(btn);btn->setMinimumSize(32, 32);btn->setCursor(QCursor(Qt::PointingHandCursor));btn->setStyleSheet(QStringLiteral("QPushButton{font-size:15px;font-weight:bold;border:none;background-color:transparent;color:black;}""QPushButton:hover{color:#409EFF;}""QPushButton:pressed{color:#409EFF;}""QPushButton:checked{color:#409EFF;}""QPushButton:disabled{color:#BCBEC2;}"));connect(btn, &QPushButton::clicked, this, &Pagination::btn_page_clicked);m_vecPageBtn.emplace_back(btn);}m_pHPageLayout->insertWidget(1, m_pBtnOmitFront);m_pHPageLayout->insertWidget(m_pHPageLayout->count() - 1, m_pBtnOmitBack);// 初始化一次界面ChangeView(m_nCurrentPage);if(lastPage > m_nMaxPage) // 上次停留的页数大于现在的最大页数m_nCurrentPage = m_nMaxPage; // 直接变成当前最大页数elsem_nCurrentPage = lastPage; // 否则还是保持当前页数ChangeView(m_nCurrentPage); // 再次刷新下当前界面// 左省略号,当作快退,即退PAGE_STEP页connect(m_pBtnOmitFront, &QPushButton::clicked, this, [&](){if(m_nCurrentPage - PAGE_STEP < MINIMUM_PAGE) m_nCurrentPage = MINIMUM_PAGE;else m_nCurrentPage -= PAGE_STEP;ChangeView(m_nCurrentPage);emit PageChanged(m_nCurrentPage);});// 右省略号,当作快进,即进PAGE_STEP页connect(m_pBtnOmitBack, &QPushButton::clicked, this, [&](){if(m_nCurrentPage + PAGE_STEP > m_nMaxPage) m_nCurrentPage = m_nMaxPage;else m_nCurrentPage += PAGE_STEP;ChangeView(m_nCurrentPage);emit PageChanged(m_nCurrentPage);});
}void Pagination::btn_page_clicked()
{QPushButton* btn = qobject_cast<QPushButton*>(sender());if(btn && btn != m_pBtnOmitFront && btn != m_pBtnOmitBack){QString str = btn->text();int nIndex = str.toInt(); // 要跳转的页数QPushButton* page = FindPage(m_nCurrentPage); // 找到当前页数按钮if(page) page->setChecked(false); // 取消选中QPushButton* nPage = FindPage(nIndex);if(nPage) nPage->setChecked(true);m_nCurrentPage = nIndex;ChangeView(m_nCurrentPage);emit PageChanged(nIndex);}
}//TotalItem/TotalItem::TotalItem(QWidget *parent) : QWidget(parent), m_nTotal(0)
{m_pLabel = new QLabel("共 0 条", this);setObjectName("total_item");setStyleSheet(QStringLiteral("QWidget#total_item{background-color:transparent;}"));m_pLabel->setStyleSheet("QLabel{font-family:Microsoft Yahei;font-size:14px;}");m_pLabel->adjustSize();setMinimumSize(m_pLabel->size().width(), m_pLabel->size().height());m_pLabel->move(0, (height() - m_pLabel->height()) / 2);
}TotalItem::~TotalItem()
{}void TotalItem::SetTotal(int nTotal)
{if(nTotal < 0) return;m_nTotal = nTotal;QString str = QString::number(nTotal);m_pLabel->setText("共 " + str + " 条");m_pLabel->adjustSize();setMinimumSize(m_pLabel->size().width(), m_pLabel->size().height());
}int TotalItem::GetTotal() const
{return m_nTotal;
}void TotalItem::paintEvent(QPaintEvent *event)
{QStyleOption opt;opt.init(this);QPainter p(this);style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);QWidget::paintEvent(event);
}///EachPageItem//EachPageItem::EachPageItem(QWidget *parent) : QWidget(parent)
{setObjectName("per_page_item");setStyleSheet(QStringLiteral("QWidget#per_page_item{background-color:transparent;}"));m_pCbx = new QComboBox(this);m_pCbx->setFixedSize(100, 27);setFixedSize(105, 30);m_pCbx->setView(new QListView(this));m_pCbx->view()->setFocusPolicy(Qt::NoFocus);m_pCbx->setStyleSheet(QStringLiteral("QComboBox{text-align:center;font-size:15px;border:1px solid #DCDFE6;border-radius:5px;}""QComboBox:hover{border:1px solid #409EFF;}""QComboBox::drop-down{background-color:transparent;}""QComboBox::down-arrow{image:url(:/pagination/skin/drop_down.png);}""QComboBox::down-arrow:on{image:url(:/pagination/skin/drop_up.png);}""QComboBox QAbstractItemView{text-align:center;font-weight:bold;border:none;font-size:14px;outline:0px;}""QComboBox QAbstractItemView::item{border:none;color:#606266;border:none;height:30px;}""QComboBox QAbstractItemView::item:selected{color:#409EFF;background:rgb(245,247,250);}"));m_pCbx->setCursor(QCursor(Qt::PointingHandCursor));m_pCbx->move(width() / 2 - m_pCbx->width() / 2, height() / 2 - m_pCbx->height() / 2);m_vecPage.reserve(5);connect(m_pCbx, QOverload<int>::of(&QComboBox::currentIndexChanged), this, [&](int index){emit EachPageItemChanged(m_vecPage[index]);});
}EachPageItem::~EachPageItem()
{}void EachPageItem::SetItemEachPage(int *args, int size)
{m_vecPage.clear();m_pCbx->clear();m_vecPage.reserve(5);for(int i = 0; i < size; i++){int n = args[i];if(n > 0){if(i > 0){if(n <= m_vecPage[i - 1]) continue;}m_vecPage.emplace_back(n);m_pCbx->addItem(QString::number(n) + "条/页");}}
}int EachPageItem::GetCurrent()
{unsigned long long idx = m_pCbx->currentIndex();if(m_vecPage.size() >= idx + 1){return m_vecPage[idx];}else return 0;
}void EachPageItem::paintEvent(QPaintEvent *event)
{QStyleOption opt;opt.init(this);QPainter p(this);style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);QWidget::paintEvent(event);
}//GotoPageItem///GotoPageItem::GotoPageItem(QWidget *parent) : QWidget(parent)
{setObjectName("goto_page_item");setStyleSheet(QStringLiteral("QWidget#goto_page_item{background-color:transparent;}"));m_pHMainLayout = new QHBoxLayout(this);m_pLabel1 = new QLabel("前往", this);m_pEditPage = new QLineEdit(this);m_pLabel2 = new QLabel("页", this);m_pLabel1->setStyleSheet(QStringLiteral("QLabel{font-size:15px;font-family:Microsoft Yahei;}"));m_pEditPage->setStyleSheet(QStringLiteral("QLineEdit{font-size:15px;font-family:Microsoft Yahei;border-radius:5px;border:1px solid #DCDFE6;}""QLineEdit:hover{border:1px solid #C0C4CC}""QLineEdit:focus{border:1px solid #409EFF;}"));m_pLabel2->setStyleSheet(QStringLiteral("QLabel{font-size:15px;font-family:Microsoft Yahei;}"));m_pLabel1->adjustSize();m_pLabel2->adjustSize();m_pEditPage->setFixedSize(60, 30);QRegExp reg("[0-9]+$");QValidator* va = new QRegExpValidator(reg, m_pEditPage);m_pEditPage->setValidator(va);m_pHMainLayout->addWidget(m_pLabel1);m_pHMainLayout->addWidget(m_pEditPage);m_pHMainLayout->addWidget(m_pLabel2);m_pHMainLayout->addStretch();m_pHMainLayout->setContentsMargins(0, 0, 0, 0);m_pEditPage->installEventFilter(this);
}GotoPageItem::~GotoPageItem()
{}void GotoPageItem::paintEvent(QPaintEvent *event)
{QStyleOption opt;opt.init(this);QPainter p(this);style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);QWidget::paintEvent(event);
}bool GotoPageItem::eventFilter(QObject *watched, QEvent *event)
{if(event->type() == QKeyEvent::KeyRelease){Qt::Key k = static_cast<Qt::Key>((dynamic_cast<QKeyEvent*>(event)->key()));if(k == Qt::Key_Return || k == Qt::Key_Enter){QString str = m_pEditPage->text();int nPage = 1;if(!str.isEmpty()) nPage = str.toInt();emit GotoPage(nPage);return true;}}return QWidget::eventFilter(watched, event);
}
#ifndef PAGINATION_H
#define PAGINATION_H#include <QWidget>
#include <QHBoxLayout>
#include <QPushButton>
#include <QLabel>
#include <QComboBox>
#include <QLineEdit>#define MINIMUM_PAGE 1
#ifndef MAX_BUTTON_COUNT
#define MAX_BUTTON_COUNT 6
#endif#ifndef PAGE_STEP
#define PAGE_STEP 5
#endifclass TotalItem;
class EachPageItem;
class GotoPageItem;class Pagination : public QWidget
{Q_OBJECT
public:explicit Pagination(QWidget *parent = nullptr);~Pagination() override;public:/*** @brief SetTotalItem 设置总条目的显示* @param nTotal 总条目*/void SetTotalItem(int nTotal);/*** @brief SetItemPerPage 设置每页显示多少条目* @param args 条目数组,数组元素必须大于0,且后面数必须大于前面* @param size 数组大小*/void SetItemPerPage(int* args, int size);/*** @brief Refresh 设置完条目或者每页条目后必须调用该函数刷新*/void Refresh();protected:void Init();void paintEvent(QPaintEvent* event) override;private:/*** @brief FindPage 找到某页* @param nIndex 要查找的页数,从1开始* @return 返回找到的页数按钮,没有则返回空*/QPushButton* FindPage(int nIndex) const;/*** @brief ClearPage 清除所有页*/void ClearPage();/*** @brief ChangeView 修改页数的显示* @param currentPage 当前页数*/void ChangeView(int currentPage);/*** @brief GetPageItem 获取m_pHPageLayout里面的第nPos按钮* @param nPos 要获取的按钮的位置,nPos的索引从0开始* @return 返回找到的按钮*/QPushButton* GetPageItem(int nPos);/*** @brief Reload 重新加载分页*/void Reload();private:QHBoxLayout* m_pHMainLayout;QHBoxLayout* m_pHPageLayout; // 存放页数QPushButton* m_pBtnLeft;QPushButton* m_pBtnRight;QPushButton* m_pBtnOmitFront; // 前面的省略号QPushButton* m_pBtnOmitBack; // 后面的省略号TotalItem* m_pTotalItem;EachPageItem* m_pItemEachPage;GotoPageItem* m_pGotoItem;int m_nCurrentPage; // 当前页数int m_nMaxPage; // 最大页数int m_nDisplayPage; // 显示的页数std::vector<QPushButton*> m_vecPageBtn;signals:void PageChanged(int nPage); // 页码变化void NumberPerPageChanged(int nCount); // 每页条码变化private slots:void btn_page_clicked();
};class TotalItem : public QWidget
{Q_OBJECT
public:explicit TotalItem(QWidget* parent = nullptr);~TotalItem() override;void SetTotal(int nTotal);int GetTotal() const;protected:void paintEvent(QPaintEvent* event) override;private:QLabel* m_pLabel;// QHBoxLayout* m_pHMainLayout;int m_nTotal;
};class EachPageItem : public QWidget
{Q_OBJECT
public:explicit EachPageItem(QWidget* parent = nullptr);~EachPageItem() override;void SetItemEachPage(int* args, int size);int GetCurrent();protected:void paintEvent(QPaintEvent* event) override;signals:void EachPageItemChanged(int nCount);private:QComboBox* m_pCbx;std::vector<int> m_vecPage;
};class GotoPageItem : public QWidget
{Q_OBJECT
public:explicit GotoPageItem(QWidget* parent = nullptr);~GotoPageItem() override;protected:void paintEvent(QPaintEvent* event) override;bool eventFilter(QObject *watched, QEvent *event) override;signals:void GotoPage(int nPage);private:QHBoxLayout* m_pHMainLayout;QLabel* m_pLabel1;QLineEdit* m_pEditPage;QLabel* m_pLabel2;
};#endif // PAGINATION_H
相关文章:

qt做的分页控件
介绍 qt做的分页控件 如何使用 创建 Pagination必须基于一个QWidget创建,否则会引发错误。 Pagination* pa new Pagination(QWidget*);设置总页数 Pagination需要设置一个总的页数,来初始化页码。 pa->SetTotalItem(count);设置可选的每页数量…...

MySQL with recursive 用法浅析
目录 写在前面 语句功能 with recursive 语法讲解 细节补充 “union all”语句 添加递归终止条件 写在前面 介绍“with recursive”用法的文章不少,但我都觉得讲的不够通俗,所以干脆自己写一篇。话不多说,进入正题。 语句功能 with r…...

ROS2常用命令集合
文章目录 指令帮助创建功能包功能包查找编译执行节点查看话题服务命令接口命令动作命令参数命令录制控制命令 指令帮助 ros2 --help # 帮助查看命令创建功能包 ros2 pkg create 包名 --build-type 构建类型 --dependencies 依赖列表 --node-name 可执行程序名称功能包查找 …...

VUE 子组件可以直接改变父组件的数据吗
子组件不可以直接改变父组件的数据。在Vue中,数据流是单向的,即父组件通过props向子组件传递数据,而子组件不能直接修改父组件的数据。这是为了维护数据流动的单向性和数据的可维护性。 如果子组件需要修改父组件的数据…...

Redis 持久化详解
AOF 持久化 AOF持久化数据恢复相对RDB慢,文件也更大,但数据丢失的风险更小。 AOF 写入 将数据写入Redis内存后,将写数据的命令记录到AOP磁盘文件。 【结构】server.aof_buf 主线程写操作执行完之后,命令会先追加到 Redis 的 se…...

基于riscv64架构的Dayu800开发板的napi_demo开发介绍
itopen组织1、提供OpenHarmony优雅实用的小工具2、手把手适配riscv qemu linux的三方库移植3、未来计划riscv qemu ohos的三方库移植 小程序开发4、一切拥抱开源,拥抱国产化 一、环境准备工作 1.1 Ubuntu20.04环境配置 如果已经配置OpenHarmony的编译环境则…...

HAL STM32 SPI/ABZ/PWM方式读取MT6816磁编码器数据
HAL STM32 SPI/ABZ/PWM方式读取MT6816磁编码器数据 📚MT6816相关资料(来自商家的相关资料): 资料:https://pan.baidu.com/s/1CAbdLBRi2dmL4D7cFve1XA?pwd8888 提取码:8888📍驱动代码编写&…...

HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 多选题序号5
基础认证题库请移步:HarmonyOS应用开发者基础认证题库 注:有读者反馈,题库的代码块比较多,打开文章时会卡死。所以笔者将题库拆分,单选题20个为一组,多选题10个为一组,题库目录如下,…...

Tekion 选择 ClickHouse Cloud 提升应用性能和指标监控
本文字数:4187;估计阅读时间:11 分钟 作者:ClickHouse team 本文在公众号【ClickHouseInc】首发 Tekion 由前 Tesla CIO Jay Vijayan 于 2016 年创立,利用大数据、人工智能和物联网等技术,为其汽车客户解决…...

mysql之触发器的使用
cr一:创建goods表和orders表; mysql> use mydb16_tirgeer Database changed mysql> create table goods(-> gid char(8) primary key,-> name varchar(10),-> price decimal(8,2),->-> num int); Query OK, 0 rows affected (0.0…...

使用Java和Hazelcast实现分布式数据存储
使用Java和Hazelcast实现分布式数据存储 大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 在分布式系统中,实现高效的数据存储和管理是非常重要的。Hazelcast作为一个内存数据网格(IMDG)&…...

Hi3751V560_SELinux
Hi3751V560_SELinux setenforce Enforcing setenforce Permissive(或“setenforce 0”) getenforce V560:demo本身的: [ 13.765161] type=1400 audit(1628821512.905:4): avc: denied { read } for pid=1926 comm="system_server" name="ifindex" d…...

邮件安全篇:邮件反垃圾系统运作机制简介
1. 什么是邮件反垃圾系统? 邮件反垃圾系统是一种专门设计用于检测、过滤和阻止垃圾邮件的技术解决方案。用于保护用户的邮箱免受未经请求的商业广告、诈骗信息、恶意软件、钓鱼攻击和其他非用户意愿接收的电子邮件的侵扰。 反垃圾系统的常见部署形式 2. 邮件反垃圾…...

LoRaWAN设备的两种入网方式(ABP和OTAA)
目录 一、OTAA 1、名词解释 2、入网流程 二、ABP 三、两种入网方式的比较 一、OTAA 1、名词解释 (1)AppEUI:64位(8字节)的唯一标识符,用于标识特定的应用程序或组织(如果用的是chirpstac…...

【Rust光年纪】极致性能与灵活选择:Rust语言数学优化库详解
Rust语言中的数学优化:六大利器汇总 前言 在当今信息时代,数据处理和数学优化成为了各行各业中不可或缺的重要环节。为了满足对高效、快速计算的需求,Rust语言逐渐成为了许多开发者的首选,因其性能优越、并发安全等特点。本文将…...
机器学习 | 回归算法原理——最小二乘法
Hi,大家好,我是半亩花海。很早便想学习并总结一本很喜欢的机器学习图书——立石贤吾的《白话机器学习的数学》,可谓通俗易懂,清晰形象。那就在此分享并作为学习笔记来记录我的学习过程吧!本章的回归算法原理基于《基于…...

.NET Core 中的字符串压缩方法
字符串压缩的概念 字符串压缩通常指的是通过算法减少字符串表示所需的数据量,同时保持字符串的原始信息或能够无损地恢复原始字符串。这种压缩可以是针对文本数据的特定算法,也可以是更通用的数据压缩算法。 .NET Core 中的字符串压缩方法 使用数据压…...

SQL 基础知识
SQL(结构化查询语言)是一种用于管理和操作关系数据库的标准编程语言。以下是一些 SQL 的基础知识: 基本概念 数据库(Database): 存储和管理数据的容器。一个数据库可以包含多个表。 表(Table&…...

【数据结构初阶】单链表经典算法题十二道——得道飞升(上篇)
目录 1、移除元素 2、反转链表 3、链表的中间节点 4、合并两个有序链表 Relaxing Time!!! ———————————————— 天气之子幻 ———————————————— 1、移除元素 思路: 创建一个新链表࿰…...

Python爬虫技术 第16节 XPath
XPath是一种在XML文档中查找信息的语言,尽管XML和HTML在语法上有区别,但XPath同样适用于HTML文档的解析,尤其是在使用如lxml这样的库时。XPath提供了一种强大的方法来定位和提取XML/HTML文档中的元素和属性。 XPath基础 XPath表达式由路径表…...

本地部署,Whisper: 开源语音识别模型
目录 简介 特点 应用 使用方法 总结 GitHub - openai/whisper: Robust Speech Recognition via Large-Scale Weak SupervisionRobust Speech Recognition via Large-Scale Weak Supervision - openai/whisperhttps://github.com/openai/whisper 简介 Whisper 是一个由 O…...

history,hash缓存那些事
vue-router 中的 createWebHistory,createWebHashHistory两种模式 createWebHistory 是基于 window.history 对象是HTML5提供的用于维护当前标签页浏览历史的对象,主要功能是前进后退和在不刷新页面的情况下,修改地址栏里的URL地址。histor…...

Spring Boot的Web开发
目录 Spring Boot的Web开发 1.静态资源映射规则 第一种静态资源映射规则 2.enjoy模板引擎 3.springMVC 3.1请求处理 RequestMapping DeleteMapping 删除 PutMapping 修改 GetMapping 查询 PostMapping 新增 3.2参数绑定 一.支持数据类型: 3.3常用注解 一.Request…...

Spark 解析嵌套的 JSON 文件
1、什么是嵌套的JSON文件? 嵌套的JSON文件是指文件中包含了嵌套的JSON对象或数组。例如,以下是一个嵌套的JSON文件的示例: {"name": "John","age": 30,"address": {"street": "123…...

VMware虚拟机中CentOS7自定义ip地址并且固定ip
配置固定ip(虚拟机) 前提:虚拟机网络配置成,自定义网络并选择VMnet8(NAT 模式) 操作(如下图):点击虚拟机–》设置–》–》硬件–》网络适配器–》自定义:特定虚拟网络–》选择:VMnet8(NAT 模式) 虚拟机网络设置 需要记…...

CCS(Code Composer Studio 10.4.0)编译软件中文乱码怎么解决
如果是所有文件都出现了中文乱码这时建议直接在窗口首选项中修改:选择"Window" -> "Preferences",找到"General" -> "Workspace",将"Text file encoding"选项设置为"Other&quo…...

Flutter 3 完全支持网页端
Flutter 3 可以用于开发网页端应用。自 Flutter 2.0 起,Flutter 就已经支持 Web 平台,并且在 Flutter 3 中得到了进一步的改进和优化。以下是使用 Flutter 3 开发网页端的一些优势和特点: Flutter 3 开发网页端的优势: 跨平台一致…...

vue.js入门
目录 一. 框架概述 二. vue常用命令 2.1 插值表达式 2.2 v-text 2.3 v-html 2.4 v-on 2.5 v-model 2.6 v-show 2.7 v-if 2.8 v-else 2.9 v-bind 2.10 v-for 三. vue生命周期函数 目录 一. 框架概述 二. vue常用命令 2.1 插值表达式 2.2 v-text 2.3 v-html 2…...

API签名认证
前言(项目背景): 这个API签名认证是API开放平台得一个重要环节,我们知道,这个API开发平台,用处就是给客户去调用现成得接口来完成某些事情得。 在讲API签名认证之前,我们先模拟一个场景并且介绍…...

C#进阶-基于.NET Framework 4.x框架实现ASP.NET WebForms项目IP拦截器
在这篇文章中,我们将探讨如何在 ASP.NET WebForms 中实现IP拦截器,以便在 ASMX Web 服务方法 和 HTTP 请求 中根据IP地址进行访问控制。我们将使用自定义的 SoapExtension 和 IHttpModule 来实现这一功能,并根据常用的两种文本传输协议&#…...