QTableWidget——表格的合并与拆分

本文介绍了如何使用QTableView的setSpan方法实现表格的行和列合并以及拆分功能,包括合并时的内容重创建和拆分时最小粒度限制。作者提供了合并和拆分的测试代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、整体思路

表格的操作使用QTableView::setSpan可以实现表格的行和列的合并
表格拆分没有对应的处理函数
主要思路:对表格的属性、内容、拆分与合并的参数进行存储,在进行拆分时对表格内容进行重新创建(不考虑效率问题)

二、效果

1、合并效果
合并操作,是将要合并的项进行了覆盖,被合并的项只是被隐藏了
在这里插入图片描述
2、拆分效果
在这里插入图片描述

三、部分测试代码

//合并操作
void MainWindow::onSpanCell()
{
    QModelIndexList list = m_table->selectionModel()->selectedIndexes();
    if (list.size() < 2)
    {
        QMessageBox::warning(this, "单元格合并", "所选中单元格中为单个单元格,无法合并", "确定");
        return;
    }

    int minRow = 0;
    int maxRow = 0;
    int minCol = 0;
    int maxCol = 0;

    QList<QTableWidgetSelectionRange> vec = m_table->selectedRanges();

    if (vec.size() > 0)
    {
        minRow = vec[0].topRow();
        maxRow = vec[0].topRow();
        minCol = vec[0].leftColumn();
        maxCol = vec[0].rightColumn();
    }

    for (auto v : vec)
    {
        if (minRow > v.topRow())
        {
            minRow = v.topRow();
        }
        if (maxRow < v.bottomRow())
        {
            maxRow = v.bottomRow();
        }

        if (minCol > v.leftColumn())
        {
            minCol = v.leftColumn();
        }
        if (maxCol < v.rightColumn())
        {
            maxCol = v.rightColumn();
        }
    }

    int rowSpan = (maxRow - minRow) + 1;
    int colSpan = (maxCol - minCol) + 1;
    m_table->setSpan(minRow, minCol, rowSpan, colSpan);
    for(auto& pRowInfro:m_tableInfor)
    {
        if(pRowInfro.first==minRow)
        {
            for(auto& pColInfro:pRowInfro.second)
            {
                if(pColInfro.first==minCol)
                {
                    pColInfro.second->rowSpan = rowSpan;
                    pColInfro.second->colSpan = colSpan;
                }
            }
        }
    }
}
//拆分
void MainWindow::onSplitCell()
{
    QList<QTableWidgetSelectionRange> vec = m_table->selectedRanges();
    if (vec.size() < 2)
    {
        QMessageBox::warning(this, QString::fromLocal8Bit("拆分表格失败"), "单元格已是最小颗粒度,不能再进行拆分", "确定");
        return;
    }
    int row,col;
    for (auto i : vec)
    {
        row = i.topRow();
        col = i.leftColumn();
        for(auto& pRowInfro:m_tableInfor)
        {
            if( pRowInfro.first == row )
            {
                for(auto& pColInfro:pRowInfro.second)
                {
                    if(pColInfro.first == col)
                    {
                        pColInfro.second->rowSpan = 0;
                        pColInfro.second->colSpan = 0;
                    }
                }
            }
        }
    }
   createTable();
}
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Liu Zz

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值