Qt QTableView(进度条与分页)

//cpp
#include "specialwidget.h"

SpecialWidget::SpecialWidget(QWidget *parent) : QWidget(parent)
{
    QPalette pe;
    QFont font;
    pe.setColor(QPalette::WindowText, Qt::black);
    font.setBold(true);
    font.setPointSize(11);

    this->setFixedSize(1280, 730);
    this->setWindowFlags(Qt::FramelessWindowHint);   //隐藏菜单栏

    QStandardItemModel* model = new QStandardItemModel();
    QStringList labels = QObject::trUtf8("ID,名字,value,时间,类别").simplified().split(",");
    model->setHorizontalHeaderLabels(labels);

    //定义item
    QStandardItem* item = 0;
    for(int i = 0;i < 1000;i++)
    {
        item = new QStandardItem(QString("%1").arg(i));
        model->setItem(i,0,item);
        item = new QStandardItem(QString("%1").arg(i*2));
        model->setItem(i,1,item);
        item = new QStandardItem(QString("%1").arg(i*3));
        model->setItem(i,2,item);
        item = new QStandardItem(QString("%1").arg(i*4));
        model->setItem(i,3,item);
        item = new QStandardItem(QString("%1").arg(i*5));
        model->setItem(i,4,item);
    }

    tableView = new QTableView(this);
    tableView->setFixedSize(1280, 670);
    tableView->setShowGrid(true);
    tableView->setGridStyle(Qt::SolidLine);
    tableView->setModel(model);
    tableView->setSelectionBehavior(QAbstractItemView::SelectRows);  //select a line
    tableView->horizontalHeader()->setHighlightSections(false);
    tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    tableView->setStyleSheet("QHeaderView::section { background-color:green; color:white};");
    tableView->verticalHeader()->setVisible(false);//隐藏表头
    //tableView->horizontalHeader()->setVisible(false);
    int totalRow = tableView->model()->rowCount();    //the total row
    int rowHeight = tableView->rowHeight(0);           //the row's height
    int tableViewHeight = tableView->height();                //every row's height
    int row1page = tableViewHeight / rowHeight - 1;
    int totalPage = totalRow / row1page;
    if(totalRow%row1page != 0) totalPage++;

    QPushButton *last_btn = new QPushButton(tr("上一页"), this);
    last_btn->setFixedSize(80, 30);
    last_btn->setPalette(pe);
    last_btn->setFont(font);
    connect(last_btn, &QPushButton::clicked, this, &SpecialWidget::lastBtn_click);

    page_edit = new QLineEdit(QString::number(1), this);
    page_edit->setFixedSize(50, 30);
    page_edit->setPalette(pe);
    page_edit->setFont(font);
    connect(page_edit, &QLineEdit::editingFinished, this, &SpecialWidget::pageTo);

    QLabel *totalPage_label = new QLabel(QString("/")+QString::number(totalPage), this);
    totalPage_label->setFixedSize(50, 30);
    totalPage_label->setPalette(pe);
    totalPage_label->setFont(font);

    QPushButton *next_btn = new QPushButton(tr("下一页"), this);
    next_btn->setFixedSize(80, 30);
    next_btn->setPalette(pe);
    next_btn->setFont(font);
    connect(next_btn, &QPushButton::clicked, this, &SpecialWidget::nextBtn_click);

    QHBoxLayout *second_layout = new QHBoxLayout();
    second_layout->setSpacing(3);
    second_layout->addStretch(1);
    second_layout->addWidget(last_btn);
    second_layout->addWidget(page_edit);
    second_layout->addWidget(totalPage_label);
    second_layout->addWidget(next_btn);
    second_layout->addStretch(1);

    QVBoxLayout *mainSec_layout = new QVBoxLayout();
    mainSec_layout->addStretch(2);
    mainSec_layout->addLayout(second_layout);
    mainSec_layout->addSpacing(2);
    this->setLayout(mainSec_layout);
/*
    QAbstractButton *btn = tableView->findChild<QAbstractButton*>();
    if(btn)
    {
        btn->setStyleSheet("QTableCornerButton::section{background-color:green}");
    }*/
    QScrollBar *scrollBar = (QScrollBar *)tableView->verticalScrollBar();
    connect(scrollBar, SIGNAL(valueChanged(int)), this, SLOT(scrollMove(int)));
}

SpecialWidget::~SpecialWidget()
{

}

void SpecialWidget::lastBtn_click()
{
    int page = page_edit->text().toInt();
    if(page <= 1) return ;

    int rowHeight = tableView->rowHeight(0);           //the row's height
    int tableViewHeight = tableView->height();                //every row's height
    int row1page = tableViewHeight / rowHeight - 1;
     tableView->verticalScrollBar()->setSliderPosition((page-2)*row1page);
     page_edit->setText(QString::number(page-1));
}

void SpecialWidget::nextBtn_click()
{
    int page= page_edit->text().toInt();

    int totalRow = tableView->model()->rowCount();    //the total row
    int rowHeight = tableView->rowHeight(0);           //the row's height
    int tableViewHeight = tableView->height();                //every row's height
    int row1page = tableViewHeight / rowHeight - 1;
    int totalPage = totalRow / row1page;
    if(totalRow%row1page != 0) totalPage++;

     tableView->verticalScrollBar()->setSliderPosition((page+1)*row1page);
     if(page+1 <= totalPage) page_edit->setText(QString::number(page+1));
}

void SpecialWidget::pageTo()
{
    if(page_edit->text().isEmpty()) return ;

    int totalRow = tableView->model()->rowCount();    //the total row
    int rowHeight = tableView->rowHeight(0);           //the row's height
    int tableViewHeight = tableView->height();                //every row's height
    int row1page = tableViewHeight / rowHeight - 1;
    int totalPage = totalRow / row1page;
    if(totalRow%row1page != 0) totalPage++;

    int page= page_edit->text().toInt();
    if(page <= 0) page = 1;
    else if(page > totalPage) page = totalPage;
    page_edit->setText(QString::number(page));

    tableView->verticalScrollBar()->setSliderPosition(row1page * (page-1));
}

void SpecialWidget::scrollMove(int )
{
    qDebug() << "scrollMove";

    int totalRow = tableView->model()->rowCount();    //the total row
    int rowHeight = tableView->rowHeight(0);           //the row's height
    int tableViewHeight = tableView->height();                //every row's height
    int row1page = tableViewHeight / rowHeight - 1;
    int totalPage = totalRow / row1page;
    if(totalRow%row1page != 0) totalPage++;

    int last = 0;
    int current = tableView->verticalScrollBar()->value();
    int next = row1page;
    for(int page=1; page<=totalPage; page++)
    {
        if(current > last && current < next)
        {
            page_edit->setText(QString::number(page));
            break;
        }
        last += row1page;
        next += row1page;
    }
    if(current >= row1page*(totalPage-1)) page_edit->setText(QString::number(totalPage));
}
//.h
#ifndef SPECIALWIDGET_H
#define SPECIALWIDGET_H

#include <QSlider>
#include <QWidget>
#include <QScrollBar>
#include <QHeaderView>
#include <QStandardItemModel>
#include <QTableView>
#include <QPushButton>
#include <QLabel>
#include <QLineEdit>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QPalette>
#include <QFont>
#include <QDebug>

class SpecialWidget : public QWidget
{
    Q_OBJECT
public:
    SpecialWidget(QWidget *parent=0);
    ~SpecialWidget();

    QLineEdit *page_edit;
    QTableView *tableView;

public slots:
    void lastBtn_click();
    void nextBtn_click();
    void pageTo();
    void scrollMove(int value);
};

#endif // SPECIALWIDGET_H

在这里插入图片描述

PyQt5的QTableView是一个用于显示和编辑表格数据的组件,但是它本身并没有提供分页显示的功能。但我们可以通过自定义的方式实现分页显示功能。 首先,我们需要创建一个继承自QAbstractTableModel的model类,这个model类负责管理表格数据。在model类中,我们可以定义一个方法来实现分页显示的功能。比如,我们可以在model类中定义一个getPage方法,用来返回指定页数的数据。在getPage方法中,我们可以根据当前页数和每页显示的数据量,计算出需要显示的数据的起始索引和结束索引,然后返回这一部分数据即可。 然后,我们需要在窗口中使用QTableView来显示数据,并且将自定义的model类设置给QTableView。然后,我们可以在窗口中添加一些按钮,用来切换页数。当点击切换页数的按钮时,我们可以调用model的getPage方法来获取指定页数的数据,然后通过setModel方法来更新QTableView的显示。 此外,我们也可以在窗口中显示当前页数和总页数等信息,让用户了解当前所在的页数。 总的来说,实现QTableView分页显示主要包括以下几个步骤: 1. 创建一个继承自QAbstractTableModel的model类。 2. 在model类中定义getPage方法,用来返回指定页数的数据。 3. 在窗口中使用QTableView来显示数据,并将model类设置给QTableView。 4. 添加按钮切换页数的功能,并调用model的getPage方法来获取指定页数的数据,并更新QTableView的显示。 5. 可选:在窗口中显示当前页数和总页数等信息。 以上就是使用PyQt5实现QTableView分页显示的大致步骤。具体的实现可以根据实际需求进行调整和优化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值