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);
}
}