Newer
Older
PagedTableDemo / QPagedTable / QPagedTable.cpp
tanyue on 16 Jul 4 KB 20250716 初始提交
#include "QPagedTable.h"
#include "ui_QPagedTable.h"

#include <QDebug>

QPagedTable::QPagedTable(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::QPagedTable)
{
    ui->setupUi(this);
}

QPagedTable::~QPagedTable()
{
    delete ui;
}

void QPagedTable::initTableWidget()
{
    // 是否隐藏行号
    ui->table->verticalHeader()->setHidden(!showVerticalHeader);

    // 设置只读
    ui->table->setEditTriggers(static_cast<QAbstractItemView::EditTriggers>(editTrigger));

    // 选中整行
    ui->table->setSelectionBehavior(static_cast<QAbstractItemView::SelectionBehavior>(selectionBehavior));
    ui->table->setFocusPolicy(Qt::NoFocus); // 去除选中虚线框
    ui->table->setAlternatingRowColors(true); // 隔行交替背景色
    ui->table->setShowGrid(false); // 不显示网格线

    ui->table->setFrameStyle(QFrame::NoFrame);

    // 设置行的高度为固定值
    ui->table->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeMode::Fixed);
}

void QPagedTable::initTableHeader()
{
    ui->table->setColumnCount(headerLabels.size());
    ui->table->setHorizontalHeaderLabels(headerLabels);

    // 设置表头的样式
    QHeaderView * header = ui->table->horizontalHeader();
    header->setMinimumHeight(headerHeight); // 表头高度
    header->setHighlightSections(highlightHeaderSection); // 选中时表头不高亮显示
}

void QPagedTable::adjustTableWidth()
{
    int realWidth = ui->table->width();
    int freeWidth = realWidth - fixedWidth - 2 * frameBorderSize;

    for (QPagedTableColumn col : columns) {
        if (col.width == 0) {
            ui->table->hideColumn(col.idx);
            continue;
        }

        ui->table->horizontalHeader()->setSectionResizeMode(col.idx, static_cast<QHeaderView::ResizeMode>(col.resizeMode));

        if (col.resizeMode == QHeaderView::ResizeMode::Fixed) {
            if (col.widthType == QPagedTableColumn::ColumnWidthType::PIXEL) {
                ui->table->setColumnWidth(col.idx, col.width);
            } else if (col.widthType == QPagedTableColumn::ColumnWidthType::PERCENT) {
                ui->table->setColumnWidth(col.idx, floor(col.width * freeWidth));
            }
        }
    }
}

void QPagedTable::setColumns(QList<QPagedTableColumn> columnList)
{
    columns = columnList;

    for (QPagedTableColumn col : columns) {
        headerLabels << col.text;

        if (col.widthType == QPagedTableColumn::ColumnWidthType::PIXEL) {
            fixedWidth += col.width;
        }
    }
}

void QPagedTable::setDatas(QList<QMap<QString, QVariant> > pagedDataList)
{
    datas = pagedDataList;
    updateTableList();
}

void QPagedTable::setPage(int pageSize, int currentPage, int totalCount, int totalPage)
{
    page.tableRowCount = pageSize;
    page.currentPage = currentPage;
    page.totalCount = totalCount;
    page.totalPage = totalPage;
}
void QPagedTable::setPageSize(int pageSize)
{
    page.tableRowCount = pageSize;
}
void QPagedTable::setTotalCount(int totalCount)
{
    page.calcTotalPage(totalCount);
}

void QPagedTable::updateTableList()
{
    // 清除原有内容
    ui->table->clearContents();
    ui->table->setRowCount(0);

    // 设置行高
    ui->table->verticalHeader()->setDefaultSectionSize(dataRowHeight);

    // 更新页码
    if (page.totalCount == 0)
    {
        ui->labelCurrPage->setText("0");
    } else
    {
        ui->labelCurrPage->setText(QString("%1 / %2 , %3").arg(page.currentPage + 1).arg(page.totalPage).arg(page.totalCount));
    }

    // 更新表格内容
    int rowIdx = 0;
    for (QMap<QString, QVariant> rowData : datas) {
        ui->table->insertRow(rowIdx);

        for (QPagedTableColumn col : columns) {
            if (col.name == "index") {
                ui->table->setItem(rowIdx, col.idx, new QTableWidgetItem(QString::number(page.currentPage * page.tableRowCount + rowIdx + 1)));
            } else {
                ui->table->setItem(rowIdx, col.idx, new QTableWidgetItem(rowData.value(col.name).toString()));
            }

            ui->table->item(rowIdx, col.idx)->setTextAlignment(static_cast<Qt::AlignmentFlag>(col.align));
        }
        rowIdx++;
    }
}


void QPagedTable::on_btnFirst_clicked()
{
    // 第一页
    page.currentPage = 0;
    emit reloadTablePagedData(page.currentPage);
}

void QPagedTable::on_btnPre_clicked()
{
    // 上一页
    if (page.currentPage > 0)
    {
        page.currentPage = page.currentPage - 1;
    }
    emit reloadTablePagedData(page.currentPage);
}

void QPagedTable::on_btnNext_clicked()
{
    // 下一页
    if (page.currentPage < page.totalPage - 1)
    {
        page.currentPage++;
    }
    emit reloadTablePagedData(page.currentPage);
}

void QPagedTable::on_btnLast_clicked()
{
    // 最后一页
    page.currentPage = page.totalPage - 1;
    emit reloadTablePagedData(page.currentPage);
}