QTableWidget实现表格数据显示以及翻页效果

效果图:

实现效果

 

代码:

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

struct Param{
    Param(int tIndex, int tX, int tY,int tAngle, int tMatch,int tScale)
        : index(tIndex), x(tX),y(tY),angle(tAngle),match(tMatch),scale(tScale)
        {}
    int index = 10 ;
    int x = 10;
    int y =10;
    int angle = 10;
    int match =10;
    int scale = 15;

};

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    void InitData();
    void InitTableWidget();

private slots:

    void on_pushButton_nextPage_clicked();

    void on_pushButton_prePage_clicked();

private:
    QVector<Param> m_vector;
    int m_label = 0 ;

    int main_pages = 1; //主页页数
    int rows_per_page = 8; //每页显示的行数
    int column_counts = 5; //每页显示的列数
    int total_pages = 1; //表格总页数
    int cur_pages_index = 1 ; //当前所在页

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

 

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QScrollBar>
#include <QDebug>
#include <QLabel>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setWindowFlag(Qt::FramelessWindowHint);
    InitData();
    InitTableWidget();
}

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

void MainWindow::InitData()
{
    for(int i = 0 ; i < 35 ; i++)
    {
        Param single_item{i,i,i,i,i,i} ;
        m_vector.append(single_item);
     }
}

void MainWindow::InitTableWidget()
{
    if(m_vector.isEmpty())
        return;

   int vector_size = m_vector.size();
   int label_pages_count = 0 ; //标签页页数

   if(m_vector.size()%3 == 0) //设置表格显示的标签数据总共有多少页
   label_pages_count =  m_vector.size()/3 ;
   else
   label_pages_count =  m_vector.size()/3 + 1;

   total_pages = main_pages + label_pages_count;


   ui->tableWidget->horizontalHeader()->setVisible(false);
   ui->tableWidget->verticalHeader()->setVisible(false);
   ui->tableWidget->setRowCount(rows_per_page* total_pages); //设置显示的行数
   ui->tableWidget->setColumnCount(column_counts); //设置每页的列数
   ui->tableWidget->setShowGrid(false);
   ui->tableWidget->setAlternatingRowColors(true); //设置间隔行颜色交替
   ui->tableWidget->setSelectionMode(QAbstractItemView::SingleSelection);
   ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);


   //显示主页数据  begin ==================================================
   ui->tableWidget->setItem(0,2, new QTableWidgetItem("值"));
   ui->tableWidget->setItem(0,3, new QTableWidgetItem("最大值"));
   ui->tableWidget->setItem(0,4, new QTableWidgetItem("最小值"));

   ui->tableWidget->setItem(2,0, new QTableWidgetItem("个数"));
   ui->tableWidget->setItem(3,0, new QTableWidgetItem("X"));
   ui->tableWidget->setItem(4,0, new QTableWidgetItem("Y"));
   ui->tableWidget->setItem(5,0, new QTableWidgetItem("相似度"));
   ui->tableWidget->setItem(6,0, new QTableWidgetItem("比率"));
   ui->tableWidget->setItem(7,0, new QTableWidgetItem("角度"));

   for(int i = 2; i < 5 ;i++)
   {
       ui->tableWidget->setItem(2,i, new QTableWidgetItem(QString::number(m_vector.at(m_label).index)));
       ui->tableWidget->setItem(3,i, new QTableWidgetItem(QString::number(m_vector.at(m_label).x)));
       ui->tableWidget->setItem(4,i, new QTableWidgetItem(QString::number(m_vector.at(m_label).y)));
       ui->tableWidget->setItem(5,i, new QTableWidgetItem(QString::number(m_vector.at(m_label).match)));
       ui->tableWidget->setItem(6,i, new QTableWidgetItem(QString::number(m_vector.at(m_label).scale)));
       ui->tableWidget->setItem(7,i, new QTableWidgetItem(QString::number(m_vector.at(m_label).angle)));
   }

   //显示标签页数据 begin=========================================================
   int index_row_begin_label_pages = main_pages*rows_per_page; //开始显示标签页时的row index;
   for(int i = 0 ; i< m_vector.size() ;i++)
   {
       //每页标签页子页内容
       int j = i%3; //i = 0,3,6,9,12,15... // j =0,1,2,3,...
       int row_index = index_row_begin_label_pages + i/3*rows_per_page ;
       if(j == 0) //新的一页标签页
       {
           ui->tableWidget->setItem(row_index+1,0, new QTableWidgetItem("个数"));
           ui->tableWidget->setItem(row_index+2,0, new QTableWidgetItem("X"));
           ui->tableWidget->setItem(row_index+3,0, new QTableWidgetItem("Y"));
           ui->tableWidget->setItem(row_index+4,0, new QTableWidgetItem("相似度"));
           ui->tableWidget->setItem(row_index+5,0, new QTableWidgetItem("比率"));
           ui->tableWidget->setItem(row_index+6,0, new QTableWidgetItem("角度"));

       }
       //第j+1页标签页,即第main_pages + j+1页
       ui->tableWidget->setItem(row_index+0,j+2, new QTableWidgetItem(QString::asprintf("标签%d",i)));
       ui->tableWidget->setItem(row_index+1,j+2, new QTableWidgetItem(QString::number(m_vector.at(i).index)));
       ui->tableWidget->setItem(row_index+2,j+2, new QTableWidgetItem(QString::number(m_vector.at(i).x)));
       ui->tableWidget->setItem(row_index+3,j+2, new QTableWidgetItem(QString::number(m_vector.at(i).y)));
       ui->tableWidget->setItem(row_index+4,j+2, new QTableWidgetItem(QString::number(m_vector.at(i).match)));
       ui->tableWidget->setItem(row_index+5,j+2, new QTableWidgetItem(QString::number(m_vector.at(i).scale)));
       ui->tableWidget->setItem(row_index+6,j+2, new QTableWidgetItem(QString::number(m_vector.at(i).angle)));

   }
   ui->tableWidget->scrollToTop();
   ui->label_index_pages->setText(QString("%1/%2").arg(cur_pages_index).arg(total_pages));
   qDebug()<<__FUNCTION__<<"ui->tableWidget->rowCount(): "<<ui->tableWidget->rowCount() << "ui->tableWidget total pages" << total_pages
          << "cur_pages_index: " << cur_pages_index;

}


void MainWindow::on_pushButton_nextPage_clicked()
{
    //   QTableView::verticalScrollBar()->setSliderPosition();  //设置当前滑动条的位置
    //   QTableView::verticalScrollBar()->maximum();             //滑动条能移动的最大位置
    //   QTableView::verticalScrollBar()->value();                   //获得当前滑动条的位置

    cur_pages_index++;
    if(cur_pages_index > total_pages)
    {
        cur_pages_index = 1;
    }

    ui->tableWidget->verticalScrollBar()->setSliderPosition(cur_pages_index*rows_per_page -rows_per_page);
    ui->label_index_pages->setText(QString("%1/%2").arg(cur_pages_index).arg(total_pages));


}

void MainWindow::on_pushButton_prePage_clicked()
{
    //   QTableView::verticalScrollBar()->setSliderPosition();  //设置当前滑动条的位置
    //   QTableView::verticalScrollBar()->maximum();             //滑动条能移动的最大位置
    //   QTableView::verticalScrollBar()->value();                   //获得当前滑动条的位置

     cur_pages_index--;
     if(cur_pages_index <= 0)
     {
         cur_pages_index = total_pages;
     }

     ui->tableWidget->verticalScrollBar()->setSliderPosition(cur_pages_index*rows_per_page -rows_per_page);
     ui->label_index_pages->setText(QString("%1/%2").arg(cur_pages_index).arg(total_pages));


}

mainwinodw.ui

mainwindow.ui文件效果

 

  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您可以通过以下步骤实现QTableWidget 将最后一列锁定: 1. 首先,将 QTableWidget 的列数增加 1,以便在最后一列添加锁定的控件。例如,如果您原来的表格有 5 列,则现在应该增加到 6 列。 2. 然后,将最后一列的单元格设置为不可编辑,避免用户在这一列输入数据。 3. 接下来,在最后一列添加您想要锁定的控件。您可以使用 QTableWidgetItem 类创建一个控件,并将其添加到表格。 4. 最后,您需要在 QTableWidget 的 resizeEvent() 事件重新定位锁定的控件。这可以通过以下代码实现: ``` void MyTableWidget::resizeEvent(QResizeEvent *event) { QTableWidget::resizeEvent(event); int width = columnWidth(columnCount() - 1); myLockingWidget->setGeometry(rect().right() - width, 0, width, height()); } ``` 其,myLockingWidget 是您在第三步添加的锁定控件。 上述步骤可以使用以下 C++ 代码实现: ``` // 创建表格 QTableWidget *tableWidget = new QTableWidget(parent); tableWidget->setColumnCount(6); // 增加一列 // 设置最后一列单元格不可编辑 for (int row = 0; row < tableWidget->rowCount(); ++row) { QTableWidgetItem *item = new QTableWidgetItem(); item->setFlags(item->flags() & ~Qt::ItemIsEditable); tableWidget->setItem(row, 5, item); // 最后一列 } // 添加锁定控件 QPushButton *lockingButton = new QPushButton(tableWidget); tableWidget->setCellWidget(row, 5, lockingButton); // 最后一列 // 重新定位锁定控件 void MyTableWidget::resizeEvent(QResizeEvent *event) { QTableWidget::resizeEvent(event); int width = columnWidth(columnCount() - 1); lockingButton->setGeometry(rect().right() - width, 0, width, height()); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值