#include "PagiNation.h"
// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
string nomalQss = R"(
QPushButton {
color: #333;
background: #fdfdfd;
border: 1px solid #dadada;
border-radius: 3px;
font-size: 8pt;
}
QPushButton:hover {
color: white;
background: #b4cafc;
border: 1px solid #598bf7;
border-radius: 3px;
font-size: 8pt;
font-weight: bold;
}
QPushButton:pressed {
color: white;
background: #9fbafa;
border: 1px solid #4d83f8;
border-radius: 3px;
font-size: 8pt;
}
)";
string checkedQss = R"(
QPushButton {
color: white;
background: #b4cafc;
border: 1px solid #598bf7;
border-radius: 3px;
font-size: 8pt;
font-weight: bold;
}
QPushButton:hover {
color: white;
background: #b4cafc;
border: 1px solid #598bf7;
border-radius: 3px;
font-size: 8pt;
font-weight: bold;
}
QPushButton:pressed {
color: white;
background: #9fbafa;
border: 1px solid #4d83f8;
border-radius: 3px;
font-size: 8pt;
}
)";
Button::Button (QString text, QWidget *parent): QPushButton(text, parent) {
QSizePolicy CL(QSizePolicy::Maximum, QSizePolicy::Expanding);
setSizePolicy(CL);
connect(this, SIGNAL(clicked()), this, SLOT(handleClick()));
setStyleSheet(QString::fromStdString(nomalQss));
};
void Button::handleClick () {
emit cClick(this);
};
void Button::setChecked (bool checked) {
if (checked) {
setStyleSheet(QString::fromStdString(checkedQss));
} else {
setStyleSheet(QString::fromStdString(nomalQss));
}
};
// --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
PagiNation::PagiNation (QWidget *parent, AlignType align, int buttonCount): QFrame(parent), _align(align), _buttonCount(buttonCount) {
_height = 20;
setFixedHeight(_height);
init();
};
PagiNation::PagiNation (QPoint point, QWidget *parent, AlignType align, int buttonCount): QFrame(parent), _align(align), _buttonCount(buttonCount) {
_height = 20;
setFixedHeight(_height);
move(point);
init();
};
PagiNation::PagiNation (QSize size, QWidget *parent, AlignType align, int buttonCount): QFrame(parent), _align(align), _buttonCount(buttonCount) {
_height = size.height();
resize(size);
setMinimumWidth(size.width());
setFixedHeight(_height);
init();
};
PagiNation::PagiNation (QRect rect, QWidget *parent, AlignType align, int buttonCount): QFrame(parent), _align(align), _buttonCount(buttonCount) {
_height = rect.height();
move(rect.x(), rect.y());
resize(rect.size());
setMinimumWidth(rect.width());
setFixedHeight(_height);
init();
};
// ----------------- 私有方法 ---------------------
void PagiNation::init () {
QFont font;
font.setPointSize(8);
if (_buttonCount % 2 != 1 || _buttonCount < 5) _buttonCount = 7;
BJ = new QHBoxLayout(this);
BJ->setSpacing(0);
BJ->setContentsMargins(0, 0, 0, 0);
TH_left = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum);
TH_right = new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum);
prevFBtn = new QPushButton("<<", this);
prevFBtn->setFont(font);
prevFBtn->setFixedSize(_height, _height);
connect(prevFBtn, SIGNAL(clicked()), this, SLOT(toPrev5()));
prevBtn = new QPushButton("<", this);
prevBtn->setFont(font);
prevBtn->setFixedSize(_height, _height);
connect(prevBtn, SIGNAL(clicked()), this, SLOT(toPrev1()));
mainBox = new QFrame(this);
QSizePolicy CL(QSizePolicy::Maximum, QSizePolicy::Expanding); // 布局策略
BJ_main = new QHBoxLayout(mainBox);
BJ_main->setSpacing(4);
BJ_main->setContentsMargins(0, 0, 0, 0);
mainBox->setSizePolicy(CL);
mainBox->setObjectName("mainBox");
mainBox->setStyleSheet("QFrame#mainBox{margin-left: 4px; margin-right: 4px;}");
nextBtn = new QPushButton(">", this);
nextBtn->setFont(font);
nextBtn->setFixedSize(_height, _height);
connect(nextBtn, SIGNAL(clicked()), this, SLOT(toNext1()));
nextFBtn = new QPushButton(">>", this);
nextFBtn->setFont(font);
nextFBtn->setFixedSize(_height, _height);
connect(nextFBtn, SIGNAL(clicked()), this, SLOT(toNext5()));
BJ->addWidget(prevFBtn);
BJ->addSpacing(2);
BJ->addWidget(prevBtn);
BJ->addWidget(mainBox);
BJ->addWidget(nextBtn);
BJ->addSpacing(2);
BJ->addWidget(nextFBtn);
setWidgetAlign();
computePage();
};
/** 计算当前页码展示 */
void PagiNation::computePage () {
QList<__PagiNation_DATA> list;
// 页码总数
int totalNum = ceil(double(_total) / double(_pageSize));
if (totalNum < _pageNow) _pageNow = totalNum == 0 ? 1 : totalNum;
if (totalNum == 0) {
__PagiNation_DATA data = {1, 1, true};
list.push_back(data);
renderBtn(list);
return;
}
if (totalNum <= _buttonCount) { // 页码总数小于等于按钮数量, 直接返回页码总数条数据
for (int i = 1; i <= totalNum; i ++) {
__PagiNation_DATA data = {1, i, _pageNow == i};
list.push_back(data);
}
renderBtn(list);
return;
}
int midIndex = (_buttonCount - 1) / 2; // 左侧按钮数量(即中间按钮索引)
int signLocation = midIndex % 2 == 0 ? midIndex / 2 : (midIndex - 1) / 2;
QVector<int> _leftArr(midIndex), _rightArr(midIndex); // 预设左右边按钮集合
for (int i = 1; i <= midIndex; i ++) {
_leftArr[i - 1] = i;
_rightArr[i - 1] = i + midIndex + 1;
}
QString position = "center"; // 当前页码所在位置, 左边(左边无需分隔点), 左侧中间按钮位置(左边无需分隔点), 中间(左右都需要分隔点), 右侧中间按钮位置(右边无需分隔点), 右边(右边无需分隔点)
int midLabel = _pageNow; // 中间按钮展示的页码数据
if (_pageNow < midIndex + 1) {
position = "left";
midLabel = midIndex + 1;
} else if (_pageNow == midIndex + 1) {
position = "centerLeft";
} else if (_pageNow > totalNum - midIndex) {
position = "right";
midLabel = totalNum - midIndex;
} else if (_pageNow == totalNum - midIndex) {
position = "centerRight";
}
QVector<__PagiNation_DATA> leftArr(midIndex), rightArr(midIndex);
for (int i = 0; i < midIndex; i ++) {
// 给左边按钮集合leftArr赋予真正的输出值
if (position == "left" || position == "centerLeft") {
__PagiNation_DATA data = {1, i + 1, _pageNow == i + 1};
leftArr[i] = data;
} else {
if (i < signLocation) {
__PagiNation_DATA data = {1, i + 1, false};
leftArr[i] = data;
} else {
__PagiNation_DATA data = {1, midLabel - (midIndex - i), false};
leftArr[i] = data;
}
}
// 给右边按钮集合rightArr赋予真正的输出值
if (position == "right" || position == "centerRight") {
__PagiNation_DATA data = {1, totalNum - (midIndex - (i + 1)), _pageNow == totalNum - (midIndex - (i + 1))};
rightArr[i] = data;
} else {
if (i > midIndex - signLocation - 1) {
__PagiNation_DATA data = {1, totalNum - (midIndex - (i + 1)), false};
rightArr[i] = data;
} else {
__PagiNation_DATA data = {1, midLabel + (i + 1), false};
rightArr[i] = data;
}
}
}
// 给中间按钮�
Qt翻页控件PagiNation
需积分: 0 110 浏览量
更新于2023-01-10
收藏 11KB RAR 举报
在Qt开发环境中,由于官方库并未提供内置的翻页控件,开发者往往需要自定义控件来实现这一功能。本文将深入探讨如何创建一个名为"PagiNation"的自定义翻页控件,以满足在GUI应用程序中进行分页浏览的需求。
我们需要了解Qt中的控件体系。Qt提供了一个丰富的类库,包括QWidget、QPushButton、QLabel等基本元素,通过继承这些类并重写必要的方法,我们可以构建出具有特定功能的自定义控件。对于PagiNation,我们可能会选择继承QWidget作为基础,并结合QPushButton和QLabel来创建翻页按钮和显示当前页数的文本。
在设计PagiNation控件时,我们应考虑以下关键特性:
1. **页面数量**:控件需要能够设置和获取总页面数,以便正确显示翻页范围。
2. **当前页数**:需要有属性来存储当前页数,并提供方法来更改它。
3. **翻页事件**:当用户点击“上一页”或“下一页”按钮时,应触发相应的事件。
4. **样式定制**:为了适应不同的界面风格,控件应支持自定义颜色、字体和布局。
5. **禁用状态**:在某些情况下,可能需要禁用翻页按钮,如在第一页时禁用“上一页”,在最后一页时禁用“下一页”。
实现这些功能时,我们可以在PagiNation类中定义对应的成员变量和信号(slots)。例如,`totalPages`表示总页数,`currentPage`表示当前页数,`previousPage`和`nextPage`为信号,用于通知外界翻页操作。同时,可以提供`setTotalPages`和`setCurrentPage`等方法来设置这些值。
接着,我们重写`paintEvent`函数来绘制控件的外观,包括按钮和标签。可以使用Qt的绘画API,如QPainter和QPen来实现。对于按钮,我们可以利用QStyle和QStyleOptionButton来实现自定义样式。
在`initUI`函数中,我们创建并布局按钮和标签。可以使用QHBoxLayout或QVBoxLayout来实现布局管理,确保控件在不同尺寸的窗口中都能正常显示。
为了响应用户点击,我们需要为“上一页”和“下一页”按钮设置信号和槽。在PagiNation类中,可以使用`QObject::connect`来连接按钮的`clicked`信号到我们的翻页事件处理函数。
此外,为了便于测试和展示,我们可以创建一个名为`paginationDemo`的示例程序。这个示例应该包含一个PagiNation实例,并连接到其翻页信号,以更新显示的内容或执行其他相关操作。
在实际应用中,PagiNation控件可以广泛应用于数据列表、图片轮播等场景,通过它,用户可以轻松地在大量内容中导航。通过自定义和扩展,PagiNation还能进一步提供分页大小选择、跳转至指定页等功能,提升用户体验。
创建一个Qt翻页控件PagiNation需要对Qt的控件体系、事件处理和界面设计有深入理解。通过合理的编程实践,我们可以打造一个功能强大、易于定制的分页组件,满足各种项目需求。
Uncle-Mao
- 粉丝: 0
- 资源: 1
最新资源
- 空中救援俯视检测19-YOLO(v5至v7)、COCO、CreateML、Darknet、Paligemma、TFRecord数据集合集.rar
- 《STM32单片机+2x180-SG90+2x360-SG90+OLED屏幕》源代码
- 空中救援任务检测2-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord、VOC数据集合集.rar
- Labview Ethernetip TCP网口通讯欧姆龙PLC OmronNX1P2NJ501NJ301PLC标签通讯 CIP通讯比Fins通讯更完美 1.自定义变量读写 2.支持 Bool单点或
- 无人船 无人艇路径跟踪控制 fossen模型matlab simulink效果 基于观测器的LOS制导结合反步法控制 ELOS+backstepping
- CA法模拟动态再结晶,晶粒正常长大,利用元胞自动机生成拓扑晶粒模型,参数可调 元胞胞自动机模拟动态再结晶母相晶粒生成 本程序基于曲率驱动机制以及热激活机制,matlab编写,本程序模拟奥氏体晶粒正
- 空中俯视物体检测9-YOLOv5数据集合集.rar
- 文本(2024-12-21 182945).txt
- java项目之芝麻开门博客网源码.zip
- java项目之讯友网络相册源码.zip