Qt——分页工具栏PageBar

头文件

#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();
}

实现的最终效果
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值