• 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. }
  • 相关阅读:
    【华为OD机试真题 python】 用连续自然数之和来表达整数【2022 Q4 | 100分】
    ubuntu 内核版本
    Unity实现设计模式——状态模式
    基于tcp协议及数据库sqlite3的云词典项目
    北大同宿舍三人毕业后分别去外企、国企、创业,10年后都后悔什么
    spring中的messageSource(国际化)
    常见的一些小函数集合
    Css Flex 弹性布局中的换行与溢出处理方法
    【论文精读5】MVSNet系列论文详解-Point-MVSNet
    SQL中:check与 contriate语句约束的区别
  • 原文地址:https://blog.csdn.net/qq_40015157/article/details/125562892