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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端养成记-实现一个低配版简单版本的vue3表单自定义设计组件

简介&#xff1a; 通过使用了最新的vue3,vite2,TypeScript等主流技术开发&#xff0c;并配合使用vuedraggable 插件以及antd design vue 组件库实现低配版本的自定义表单设计组件&#xff1b; 项目地址&#xff1a;https://gitee.com/hejunqing/vue3-antdv-generator

PyTorch模型训练步步详解:从零开始构建深度学习流程

P y T o r c h 训练模型流程图 PyTorch训练模型流程图 P y T orc h 训练模型流程图

非凸T0算法,如何获取超额收益?

什么是非凸 T0 算法&#xff1f; 非凸 T0 算法基于投资者持有的股票持仓&#xff0c;利用机器学习等技术&#xff0c;短周期预测&#xff0c;全自动操作&#xff0c;抓取行情波动价差&#xff0c;增厚产品收益。通过开仓金额限制、持仓时长控制等&#xff0c;把控盈亏风险&…

学习笔记:MySQL数据库操作5

1. 触发器&#xff08;Triggers&#xff09; 触发器是数据库的一种高级功能&#xff0c;它允许在执行特定数据库操作&#xff08;如INSERT、UPDATE、DELETE&#xff09;之前或之后自动执行一段代码。 1.1 创建商品和订单表 商品表&#xff08;goods&#xff09; gid: 商品编号…

会话存储、本地存储,路由导航守卫、web会话跟踪、JWT生成token、axios请求拦截、响应拦截

1、会话存储、本地存储 前端浏览器中存储用户信息&#xff0c;会话存储、本地存储、cookie 会话存储&#xff08;sessionStorage&#xff09;&#xff1a;会话期间存储&#xff0c;关闭浏览器后&#xff0c;数据就会销毁 sessionStorage.setItem("account",resp.d…

反射型与dom型的xss的区别【源码分析】

反射型 XSS 和 DOM 型 XSS 都属于跨站脚本攻击 (XSS) 的类型&#xff0c;它们的共同点是均能通过注入恶意脚本在用户浏览器中执行&#xff0c;不同点是dom型xss不经过服务器&#xff0c;而反射型是经过服务器的。但是&#xff0c;它们在攻击方式、执行过程和防御措施上有所不同…

Servlet2-HTTP协议、HttpServletRequest类、HttpServletResponse类

目录 HTTP协议 什么是HTTP协议 HTTP协议的特点 请求的HTTP协议格式 GET请求 POST请求 常用的请求头说明 哪些是GET请求&#xff0c;哪些是POST请求 响应的HTTP协议格式 常见的响应码说明 MIME类型说明 HttpServletRequest类 作用 常用方法 如何获取请求参数 po…

IP 泄露: 原因与避免方法

始终关注您的IP信息&#xff01; 您的IP地址不仅显示您的位置&#xff0c;它包含几乎所有的互联网活动信息&#xff01; 如果出现IP泄漏&#xff0c;几乎所有的信息都会被捕获甚至非法利用&#xff01; 那么&#xff0c;网站究竟如何追踪您的IP地址&#xff1f;您又如何有效…

从0开始的STM32HAL库学习9

定时器输入捕获测频率 生成待测信号 配置环境 选择如上图所示 代码修改 在main函数中加入 HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1); 测量信号频率 配置环境 如图所示打开TIM3定时器 1. 设置TI1FP1为ResetMode,即清空计数 2. 使用内部时钟 3. 通道 1 设置为输…

日本的便利店真的“无所不能”?!简直不要太方便了

众所周知&#xff0c;日本便利店可谓是日本人离不来的存在了&#xff01;真真是“要啥有啥”&#xff0c;可以说日本的便利店才是真正意义上的“便利”~ 那日本的便利店到底有什么与众不同呢&#xff1f;&#xff1f;今天小编来带大家盘点一下日本便利店的那些服务。 一、购票…

《2024新质生产力引领下十大重点产业趋势解读--大模型篇》,深剖当下爆火的大模型产业!

01 报告导读 “新质生产力”重要性再提升。 近日&#xff0c;作为热词的“新质生产力”再度被多次提及&#xff0c;“新质生产力”这一概念近年来在经济和社会发展中被频繁提及&#xff0c;它指的是通过创新驱动&#xff0c;利用新技术、新业态、新模式推动生产力发展的新形态…

opencascade AIS_MouseGesture AIS_MultipleConnectedInteractive源码学习

AIS_MouseGesture //! 鼠标手势 - 同一时刻只能激活一个。 enum AIS_MouseGesture { AIS_MouseGesture_NONE, //!< 无激活手势 // AIS_MouseGesture_SelectRectangle, //!< 矩形选择&#xff1b; //! 按下按钮开始&#xff0c;移动鼠标定义矩形&…

【Linux】玩转操作系统,深入刨析进程状态与调度机制

目录 1. 进程排队2. 进程状态的表述2.1. 进程状态2.2 运行状态2.3. 阻塞状态2.4. 挂起状态 3. Linux下具体的进程状态3.1. 运行状态R3.2. 可中断睡眠状态S3.3. 不可中断睡眠状态D3.4. 停止状态T3.5. 死亡状态X3.6. 僵尸状态Z 4. 孤儿进程5. 优先级6. Linux的调度与切换6.1. 四个…

在linux上面用drissionpage自动化遇到反爬?

目录 一、反爬内容1、案例12、案例2 二、后来发现的问题解决 一、反爬内容 1、案例1 反爬的响应文本返回如下&#xff1a;爬虫均能精准识别,测试链接:https://ziyuan.baidu.com/crawltools/index)非正常爬虫访问时:返回的压缩报文内容无法直接识别,可一定程度上保护站点信息安…

C语言进阶——一文带你深入了解“C语言关键字”(中篇)

本篇文章属于C语言进阶篇的“C语言关键字”&#xff0c;旨在分享我对C语言关键字的深度学习和了解。同时带领大家深入浅出的走进C语言进阶知识——关键字篇&#xff01; 目录 一、变量的命名规则 二、标识符的命名规则 一、变量的命名规则 1、命名应当直观且可以拼读&#x…

【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常

问题现象 BeetISQL中间件版本&#xff1a;2.13.8.RELEASE 客户在调用BeetISQL提供的api向yashandb的表中执行batch insert并将返回sequence设置到传入的java bean时&#xff0c;报如下异常&#xff1a; 问题的风险及影响 影响业务流程正常执行&#xff0c;无法获得batch ins…

史诗级动态分屏多画面PR开场视频模板MOGRT

Premiere Pro模板&#xff0c;创意史诗级动态分屏多画面开场视频模板mogrt 主要特点 全高清&#xff08;19201080&#xff09;分辨率 Pr2021或更高版本软件 非常易于定制 00:33秒持续时间 7个文本占位符 34个媒体占位符 https://prmuban.com/39328.html

【论文共读】【翻译】【GPT】Improving Language Understanding by Generative Pre-Training

GPT 原论文地址 翻译&#xff1a; Improving Language Understanding by Generative Pre-Training 通过生成式预训练提高语言理解能力 0. 摘要 自然语言理解包括各种不同的任务&#xff0c;例如文本蕴涵、问答、语义相似性评估和文档分类。尽管大量未标记的文本语料库很丰富…

基于 uPlot.js 的分段彩色条形图

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 基于 uPlot.js 的分段彩色条形图 应用场景 分段彩色条形图广泛应用于数据可视化领域&#xff0c;用于展示数据的分布和趋势。它可以通过不同的颜色来表示数据的不同范围&#xff0c;帮助用户快速识别和理解数…

苹果手机微信拉黑了怎么恢复?简单3招,找回好友!

我们平时在使用微信和朋友交往的过程中&#xff0c;难免会产生一些摩擦&#xff0c;有时候我们可能因为一时冲动或误会而误将好友拉入黑名单。但当冷静下来&#xff0c;想要找回那份友谊时&#xff0c;该怎么办呢&#xff1f;别急&#xff0c;这里有3招简单又实用的方法&#x…