• QT QTableWidget 表格列置顶需求的思路和代码


    QT  项目使用 QTableWidget时 遇到的需求:

    表格列的置顶、取消置顶

    点击某一列置顶,如没有置顶列则置顶到第一列,如前方有置顶列则往置顶列之后排。

    取消置顶列时,还原到置顶列最后位置,如果是置顶最后一列,位置不用动

    (例子中,因为还有一个表头列,所以节目1所在为第一列)

    大概思路:

    每列表格项里有自定义类,如果删除再新建会比较麻烦。

    所以我采用的是,先新建列,然后把点击列里每列表格项的内容复制到新列里,然后再删除点击列


    项目示例操作流程:

    1、先选择节目1  置顶到第一列

    2、选择节目3 置顶  会排到节目1 后面

    2、以此类推 选择节目4 置顶  会排到节目3 后面(此时如果取消置顶节目4,位置不变)

    3、此时点击节目3取消置顶,则排到置顶列的最后一项,以此类推

     主要代码:

    1. //置顶
    2. void MyManagement::setColTop() {
    3. int curCol = clickedTableCol;//当前点击列
    4. int toCol = 0;
    5. for(int s = 0;s<programList.size();s++){//programList 所有列数组
    6. if(programList[s]->isTop == 1) {//isTop 是否为置顶
    7. toCol++;
    8. }
    9. }
    10. toCol++;//要置顶到的列数, 没有置顶则到第一列,有置定则置顶数+1
    11. QWidget *item = qTableWidget->cellWidget(0,curCol);
    12. // TableWidgetHeadItem *item = dynamic_cast<TableWidgetHeadItem*>(ui->qTableWidget->cellWidget(0,curCol));
    13. qDebug() << " curCol11== " << curCol;
    14. ui->qTableWidget->insertColumn(toCol); // 先插入列,列内容复制到新列中,再删除之前列(不用先删除再新建比较复杂)
    15. // int colnum = ui->qTableWidget->columnCount();
    16. // ui->qTableWidget->setColumnCount(colnum);//设置列数
    17. item->setStyleSheet("QLabel{color:rgb(173, 53, 0);}");
    18. qTableWidget->setCellWidget(0, toCol, item);//表头
    19. int nRowCount = qTableWidget->rowCount(); //复制表格里内容
    20. for(int row=1; row<nRowCount; row++){
    21. qDebug() << "==row== " << row << " curCol== "<< curCol;
    22. QWidget *wdg = qTableWidget->cellWidget(row, curCol + 1);//前面已插入列 获取单元格内容需加1
    23. qTableWidget->setCellWidget(row, toCol, wdg);
    24. }
    25. qTableWidget->removeColumn(curCol + 1);//删除点击列,置顶到前面一列,删除需+1
    26. // 修改数组里的属性
    27. for(int s = 0;s<programList.size();s++){
    28. if(programList[s]->col == curCol) {
    29. programList[s]->isTop = 1;
    30. programList[s]->col = toCol;
    31. }else if(programList[s]->col < curCol && programList[s]->isTop == 0){//点击要置顶的列后面不管,前面不是置顶的+1
    32. programList[s]->col += 1;
    33. }
    34. }
    35. clickedTableCol = toCol;
    36. qDebug() << "置顶后col 位置" << clickedTableCol;
    37. qTableWidget->setCurrentCell(0, clickedTableCol);
    38. // ui->qTableWidget->resizeColumnsToContents();
    39. // ui->qTableWidget->resizeRowsToContents();
    40. }
    1. //取消置顶
    2. void MyManagement::cancelColTop() {
    3. int curCol = clickedTableCol;
    4. int toCol = 0;
    5. for(int s = 0;s<programList.size();s++){
    6. if(programList[s]->isTop == 1) {
    7. toCol++;
    8. }
    9. }
    10. qDebug() << " 取消置顶 curCol11== " << curCol << " toCol== " << toCol;
    11. QWidget *item = qTableWidget->cellWidget(0,curCol);
    12. item->setStyleSheet("QLabel{color:rgb(255, 255, 255);}");
    13. if(toCol == curCol) {//列在置顶的最后 位置不变
    14. for(int s = 0;s<programList.size();s++){
    15. if(programList[s]->col == curCol) {
    16. programList[s]->isTop = 0;
    17. }
    18. }
    19. } else {
    20. qTableWidget->insertColumn(toCol + 1);//置顶最后一列+1 插入
    21. qTableWidget->setCellWidget(0, toCol + 1, item);
    22. int nRowCount = qTableWidget->rowCount(); //复制表格里内容
    23. for(int row=1; row<nRowCount; row++){
    24. qDebug() << "==row== " << row << " curCol== "<< curCol;
    25. QWidget *wdg = qTableWidget->cellWidget(row, curCol);//前面已插入列 获取单元格内容需加1
    26. qTableWidget->setCellWidget(row, toCol + 1, wdg);
    27. }
    28. qTableWidget->removeColumn(curCol);
    29. for(int s = 0;s<programList.size();s++){
    30. if(programList[s]->col == curCol) {//先修改当前列
    31. programList[s]->isTop = 0;
    32. programList[s]->col = toCol;
    33. } else if(programList[s]->col > curCol){//比当前置顶列大
    34. if(programList[s]->isTop == 1) {//为置顶列
    35. programList[s]->col -= 1;
    36. }
    37. }
    38. }
    39. }
    40. clickedTableCol = toCol;
    41. qDebug() << "取消置顶后col 位置" << clickedTableCol << " toCol== " << toCol;
    42. qTableWidget->setCurrentCell(0, clickedTableCol);
    43. }
  • 相关阅读:
    系统入门到实战学习某项技术、有问题找“百度“、学习优秀的技术博客、找开源代码等资料
    jsp健身房会员管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
    多分类-手写识别体
    Vue急速入门-5
    vscode 实用插件
    自动融合,驰骋海外丨跨境电商YescomUSA携手云扩实现一站式自动化服务
    智能插帧,打造丝滑视频体验
    【算法】迷宫问题
    Grafana 系列-GaC-2-Grafana Terraform Provider 基础
    Kotlin高阶函数&DSL布局劝退指南
  • 原文地址:https://blog.csdn.net/qq_40015157/article/details/125562892