头文件
#ifndef PAGEBAR_H
#define PAGEBAR_H
#include <QWidget>
class QPushButton;
class QLabel;
class QHBoxLayout;
class PageBar : public QWidget
{
Q_OBJECT
public:
explicit PageBar(QWidget *parent = nullptr);
~PageBar();
void setCount(const int &count);
signals:
void pageChanged(int);
protected slots:
void onBtnClicked(bool checked);
protected:
void initialize();
void updateButtons(bool isUp = false);
void clearButtons();
private:
int m_nCount = 0;
int m_nCurrent = 0;
int m_nBtnW = 20;
int m_nBtnH = 20;
QPushButton *m_pUp = nullptr;
QPushButton *m_pNext = nullptr;
QVector<QPushButton*> m_vecBtns;
QHBoxLayout *m_pHBoxLayout = nullptr;
};
#endif // PAGEBAR_H
源文件
#include "pagebar.h"
#include <QLabel>
#include <QPushButton>
#include <QHBoxLayout>
PageBar::PageBar(QWidget *parent) :
QWidget(parent)
{
initialize();
}
PageBar::~PageBar()
{
}
void PageBar::setCount(const int &count)
{
if(0 >= count){
return;
}
m_nCount = count;
m_nCurrent = 1;
updateButtons();
}
void PageBar::onBtnClicked(bool checked)
{
Q_UNUSED(checked)
if(m_vecBtns.isEmpty()){
return;
}
int current = static_cast<QPushButton*>(sender())->whatsThis().toInt();
switch (current) {
case -1://Up
{
if(1 >= m_nCurrent){
return;
}
m_nCurrent--;
}
break;
case -2://Next
{
if(m_nCount <= m_nCurrent){
return;
}
m_nCurrent++;
}
break;
default:
{
m_nCurrent = current;
}
break;
}
int nFirst = m_vecBtns.first()->whatsThis().toInt();
int nLast = m_vecBtns.last()->whatsThis().toInt();
if(nLast < m_nCurrent){
updateButtons();
}
if(nFirst > m_nCurrent){
updateButtons(true);
}
foreach (QPushButton *pBtn, m_vecBtns) {
int c = pBtn->whatsThis().toInt();
if(c != m_nCurrent){
pBtn->setChecked(false);
}else{
pBtn->setChecked(true);
}
}
emit pageChanged(m_nCurrent);
}
void PageBar::initialize()
{
m_vecBtns.clear();
m_pHBoxLayout = new QHBoxLayout;
m_pHBoxLayout->setMargin(0);
m_pHBoxLayout->setSpacing(3);
this->setLayout(m_pHBoxLayout);
m_pUp = new QPushButton("<");
m_pUp->setFixedSize(m_nBtnW,m_nBtnH);
m_pUp->setWhatsThis("-1");
m_pNext = new QPushButton(">");
m_pNext->setFixedSize(m_nBtnW,m_nBtnH);
m_pNext->setWhatsThis("-2");
m_pHBoxLayout->addStretch();
m_pHBoxLayout->addWidget(m_pUp);
m_pHBoxLayout->addWidget(m_pNext);
connect(m_pUp,SIGNAL(clicked(bool)),this,SLOT(onBtnClicked(bool)));
connect(m_pNext,SIGNAL(clicked(bool)),this,SLOT(onBtnClicked(bool)));
}
void PageBar::updateButtons(bool isUp)
{
if(0 >= m_nCount ||
m_nCurrent < 1 ||
m_nCurrent > m_nCount){
return;
}
clearButtons();
int nC = 4;
int nStart = 0;
int nEnd = 0;
if(isUp){
nStart = (1 >= (m_nCurrent - nC)) ? 1 : m_nCurrent - nC;
nEnd = (m_nCurrent < nC + 1) ? nC + 1 : m_nCurrent;
}else{
nStart = m_nCurrent;
nEnd = ((m_nCurrent + nC) > m_nCount) ? m_nCount : m_nCurrent + nC;
}
for (int i = nStart; i <= nEnd ; ++i) {
QPushButton *pButton = new QPushButton(QString::number(i));
pButton->setFixedSize(m_nBtnW,m_nBtnH);
pButton->setCheckable(true);
pButton->setWhatsThis(QString::number(i));
if(i == m_nCurrent){
pButton->setChecked(true);
}
connect(pButton,SIGNAL(clicked(bool)),this,SLOT(onBtnClicked(bool)));
m_vecBtns.append(pButton);
}
int nIndex = 2;
foreach (QPushButton *pBtn, m_vecBtns) {
m_pHBoxLayout->insertWidget(nIndex,pBtn);
++nIndex;
}
}
void PageBar::clearButtons()
{
foreach (QPushButton *pBtn, m_vecBtns) {
m_pHBoxLayout->removeWidget(pBtn);
pBtn->setParent(nullptr);
delete pBtn;
pBtn = nullptr;
}
m_vecBtns.clear();
}
实现的最终效果