QT 项目使用 QTableWidget时 遇到的需求:
表格列的置顶、取消置顶
点击某一列置顶,如没有置顶列则置顶到第一列,如前方有置顶列则往置顶列之后排。
取消置顶列时,还原到置顶列最后位置,如果是置顶最后一列,位置不用动
(例子中,因为还有一个表头列,所以节目1所在为第一列)
大概思路:
每列表格项里有自定义类,如果删除再新建会比较麻烦。
所以我采用的是,先新建列,然后把点击列里每列表格项的内容复制到新列里,然后再删除点击列
项目示例操作流程:
1、先选择节目1 置顶到第一列
2、选择节目3 置顶 会排到节目1 后面
2、以此类推 选择节目4 置顶 会排到节目3 后面(此时如果取消置顶节目4,位置不变)
3、此时点击节目3取消置顶,则排到置顶列的最后一项,以此类推
主要代码:
- //置顶
- void MyManagement::setColTop() {
- int curCol = clickedTableCol;//当前点击列
- int toCol = 0;
- for(int s = 0;s<programList.size();s++){//programList 所有列数组
- if(programList[s]->isTop == 1) {//isTop 是否为置顶
- toCol++;
- }
- }
- toCol++;//要置顶到的列数, 没有置顶则到第一列,有置定则置顶数+1
-
- QWidget *item = qTableWidget->cellWidget(0,curCol);
- // TableWidgetHeadItem *item = dynamic_cast<TableWidgetHeadItem*>(ui->qTableWidget->cellWidget(0,curCol));
-
- qDebug() << " curCol11== " << curCol;
- ui->qTableWidget->insertColumn(toCol); // 先插入列,列内容复制到新列中,再删除之前列(不用先删除再新建比较复杂)
- // int colnum = ui->qTableWidget->columnCount();
- // ui->qTableWidget->setColumnCount(colnum);//设置列数
- item->setStyleSheet("QLabel{color:rgb(173, 53, 0);}");
-
- qTableWidget->setCellWidget(0, toCol, item);//表头
-
- int nRowCount = qTableWidget->rowCount(); //复制表格里内容
- for(int row=1; row<nRowCount; row++){
- qDebug() << "==row== " << row << " curCol== "<< curCol;
- QWidget *wdg = qTableWidget->cellWidget(row, curCol + 1);//前面已插入列 获取单元格内容需加1
- qTableWidget->setCellWidget(row, toCol, wdg);
- }
-
- qTableWidget->removeColumn(curCol + 1);//删除点击列,置顶到前面一列,删除需+1
-
- // 修改数组里的属性
- for(int s = 0;s<programList.size();s++){
- if(programList[s]->col == curCol) {
- programList[s]->isTop = 1;
- programList[s]->col = toCol;
- }else if(programList[s]->col < curCol && programList[s]->isTop == 0){//点击要置顶的列后面不管,前面不是置顶的+1
- programList[s]->col += 1;
- }
- }
-
- clickedTableCol = toCol;
- qDebug() << "置顶后col 位置" << clickedTableCol;
-
- qTableWidget->setCurrentCell(0, clickedTableCol);
-
- // ui->qTableWidget->resizeColumnsToContents();
- // ui->qTableWidget->resizeRowsToContents();
- }
- //取消置顶
- void MyManagement::cancelColTop() {
- int curCol = clickedTableCol;
- int toCol = 0;
- for(int s = 0;s<programList.size();s++){
- if(programList[s]->isTop == 1) {
- toCol++;
- }
- }
- qDebug() << " 取消置顶 curCol11== " << curCol << " toCol== " << toCol;
-
- QWidget *item = qTableWidget->cellWidget(0,curCol);
- item->setStyleSheet("QLabel{color:rgb(255, 255, 255);}");
-
- if(toCol == curCol) {//列在置顶的最后 位置不变
- for(int s = 0;s<programList.size();s++){
- if(programList[s]->col == curCol) {
- programList[s]->isTop = 0;
- }
- }
- } else {
- qTableWidget->insertColumn(toCol + 1);//置顶最后一列+1 插入
- qTableWidget->setCellWidget(0, toCol + 1, item);
-
- int nRowCount = qTableWidget->rowCount(); //复制表格里内容
- for(int row=1; row<nRowCount; row++){
- qDebug() << "==row== " << row << " curCol== "<< curCol;
- QWidget *wdg = qTableWidget->cellWidget(row, curCol);//前面已插入列 获取单元格内容需加1
- qTableWidget->setCellWidget(row, toCol + 1, wdg);
- }
-
- qTableWidget->removeColumn(curCol);
-
- for(int s = 0;s<programList.size();s++){
- if(programList[s]->col == curCol) {//先修改当前列
- programList[s]->isTop = 0;
- programList[s]->col = toCol;
- } else if(programList[s]->col > curCol){//比当前置顶列大
- if(programList[s]->isTop == 1) {//为置顶列
- programList[s]->col -= 1;
- }
- }
- }
- }
-
- clickedTableCol = toCol;
- qDebug() << "取消置顶后col 位置" << clickedTableCol << " toCol== " << toCol;
- qTableWidget->setCurrentCell(0, clickedTableCol);
- }