QTableWidget整理

1.关于表格右键菜单

    m_table->setContextMenuPolicy(Qt::CustomContextMenu);//要开启右键菜单要加这个权限

   信号:customContextMenuRequested(const QPoint &)

   槽函数:OnTableCustomContextMenuRequested(const QPoint &pos)

2. 关于TableWidget大数据载入卡顿优化:

   1). 最优方案是:分页,只new出一页,剩下的就是当页面切换时进行内容覆盖。

   2). 在table载入数据之前,直接设置表的行数,然后进行对应坐标赋值。(不要使用insertRow,因为会很卡)。

void FrameGroup::OnTableCustomContextMenuRequested(const QPoint &pos)
{
    if (!mFrameGroupTable->m_table)
        return;
    QMenu *pMenu = new QMenu(this);
    QTableWidgetItem* pItem = mFrameGroupTable->m_table->itemAt(pos);
    if (pItem)
    {
        CNSTableWidgetItem* headItem = dynamic_cast<CNSTableWidgetItem*>(mFrameGroupTable->m_table->horizontalHeaderItem(pItem->column()));
        if (headItem)
        {
            if (headItem->text().compare(StrToQStr("第二列表头")) == 0 || headItem->text().compare(StrToQStr("第三列表头")) == 0)
            {
                pMenu->addAction(StrToQStr("增加一行"), this, SLOT(OnAddItem()));
            }
            else if (headItem->text().compare(StrToQStr("第四列表头")) == 0 || headItem->text().compare(StrToQStr("第五列表头")) == 0)
            {
                pMenu->addAction(StrToQStr("增加一行"), this, SLOT(OnAddItem()));
                pMenu->addAction(StrToQStr("删除一行"), this, SLOT(OnDelItem()));
            }
        }
    }    
    pMenu->exec(QCursor::pos());
    delete pMenu;
}
 

//新增一行

void CFrameGroup::OnAddItem()
{
    if (!mFrameGroupTable->m_table || mFrameGroupTable->m_table->columnCount() <= 0)
        return;
    CNSTableWidgetItem* currentClickTableItem = dynamic_cast<CNSTableWidgetItem*>(mFrameGroupTable->m_table->currentItem());
    int row = currentClickTableItem->row();
    mFrameGroupTable->m_table->insertRow(row + 1);
    CNSTableWidgetItem * item1 = new CNSTableWidgetItem(mFrameGroupTable->m_table->item(row, 0)->text());
    mFrameGroupTable->m_table->setItem(row + 1, 0, item1);
    CNSTableWidgetItem * item2 = new CNSTableWidgetItem(mFrameGroupTable->m_table->item(row, 1)->text());
    mFrameGroupTable->m_table->setItem(row + 1, 1, item2);
    CNSTableWidgetItem * item3 = new CNSTableWidgetItem(mFrameGroupTable->m_table->item(row, 2)->text());
    mFrameGroupTable->m_table->setItem(row + 1, 2, item3);
    CNSTableWidgetItem * item4 = new CNSTableWidgetItem("");
    mFrameGroupTable->m_table->setItem(row + 1, 3, item4);
    CNSTableWidgetItem * item5 = new CNSTableWidgetItem("");
    mFrameGroupTable->m_table->setItem(row + 1, 4, item5);
    spanItem();
}


//删除表格中一行数据
void CFrameGroup::OnDelItem()
{
    CNSTableWidgetItem *deleteItem =dynamic_cast<CNSTableWidgetItem*>(mFrameGroupTable->m_table->currentItem());
    if (deleteItem == NULL)
    {
        return;
    }
    int row = deleteItem->row();
    int column = deleteItem->column();
    QString deleteRowOneColumnText = mFrameGroupTable->m_table->item(row, 0)->text();
    CNSTableWidgetItem* frontItem = NULL;
    CNSTableWidgetItem* nextItem = NULL;
    if (row > 0)
    {
        frontItem =dynamic_cast<CNSTableWidgetItem*>(mFrameGroupTable->m_table->item(deleteItem->row() - 1, deleteItem->column()));
    }
    if (row < mFrameGroupTable->m_table->rowCount())
    {
        nextItem = dynamic_cast<CNSTableWidgetItem*>(mFrameGroupTable->m_table->item(row + 1, deleteItem->column()));
    }
    if (frontItem == NULL && nextItem != NULL)
    {
        if (deleteRowOneColumnText.compare(mFrameGroupTable->m_table->item(nextItem->row(), 0)->text()) != 0)
        {
            mFrameGroupTable->m_table->item(row, 3)->setText("");
            mFrameGroupTable->m_table->item(row, 4)->setText("");
        }
        else
        {
            mFrameGroupTable->m_table->removeRow(row);        
        }
    }
    else if (frontItem != NULL && nextItem == NULL)
    {
        if (deleteRowOneColumnText.compare(mFrameGroupTable->m_table->item(frontItem->row(), 0)->text()) != 0)
        {
            mFrameGroupTable->m_table->item(row, 3)->setText("");
            mFrameGroupTable->m_table->item(row, 4)->setText("");
        }
        else
        {
            mFrameGroupTable->m_table->removeRow(row);
        }
    }
    else if (frontItem != NULL && nextItem != NULL)
    {
        QString frontText = mFrameGroupTable->m_table->item(frontItem->row(), 0)->text();
        QString nextText = mFrameGroupTable->m_table->item(nextItem->row(), 0)->text();
        if (deleteRowOneColumnText.compare(frontText) == 0 || deleteRowOneColumnText.compare(nextText) == 0)
        {
            mFrameGroupTable->m_table->removeRow(row);
        }
        else if (deleteRowOneColumnText.compare(frontText) != 0 && deleteRowOneColumnText.compare(nextText) != 0)
        {
            mFrameGroupTable->m_table->item(row, 3)->setText("");
            mFrameGroupTable->m_table->item(row, 4)->setText("");
        }
    }
    spanItem();
    return;
}

//  对表格的第1,2,3列进行单元格合并
void CFrameGroup::spanItem()
{
    int row = mFrameGroupTable->m_table->rowCount();
    int j = 0;
    for (int columnIndex = 0; columnIndex < 3; columnIndex++)
    {
        for (int i = 0; i < row - 1; i++)
        {
            QTableWidgetItem* pItem = mFrameGroupTable->m_table->item(i, 0);
            QString text;
            if (NULL != pItem)
            {
                text = pItem->text();
            }

            if (text.isEmpty())
            {
                return;
            }
            else
            {
                QString NextText;
                pItem = mFrameGroupTable->m_table->item(i + 1, 0);
                if (NULL != pItem)
                {
                    NextText = pItem->text();
                }
                if (text != NextText)
                {
                    mFrameGroupTable->m_table->setSpan(j, 0, i - j + 1, 1);
                    mFrameGroupTable->m_table->setSpan(j, 1, i - j + 1, 1);
                    mFrameGroupTable->m_table->setSpan(j, 2, i - j + 1, 1);
                    j = i + 1;
                }
            }

        }
        mFrameGroupTable->m_table->setSpan(j, 0, row - j, 1);
        mFrameGroupTable->m_table->setSpan(j, 1, row - j, 1);
        mFrameGroupTable->m_table->setSpan(j, 2, row - j, 1);
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值