#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QDebug>
using namespace std;
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_table = new QTableWidget(this);
m_table->setGeometry(10,10,800,450);
m_table->setRowCount(5);
m_table->setColumnCount(6);
m_table->setContextMenuPolicy(Qt::CustomContextMenu);
init();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::init()
{
readTableData();
createMenu();
connect(m_table, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(onCellOperateMenu(QPoint)));
}
void MainWindow::createMenu()
{
m_menu = new QMenu;
m_menu->addAction(QString::fromLocal8Bit("合并单元格"), this, &MainWindow::onSpanCell);
m_menu->addAction(QString::fromLocal8Bit("拆分单元格"), this, &MainWindow::onSplitCell);
}
void MainWindow::createTable()
{
int rowNum = m_table->rowCount();
int colNum = m_table->columnCount();
m_table->setRowCount(0);
m_table->setColumnCount(0);
m_table->setRowCount(rowNum);
m_table->setColumnCount(colNum);
QList<QTableWidgetItem*> list = m_table->selectedItems();
for(auto& pRowInfro:m_tableInfor)
{
for(auto& pCol:pRowInfro.second)
{
if(pCol.second->rowSpan > 0||pCol.second->colSpan > 0)
{
m_table->setSpan(pCol.second->row, pCol.second->col, pCol.second->rowSpan , pCol.second->colSpan);
}
QTableWidgetItem * pItem = new QTableWidgetItem(pCol.second->data);
m_table->setItem(pCol.second->row, pCol.second->col,pItem);
}
}
}
void MainWindow::readTableData()
{
int row;
TableItemInfor* infor;
for(row = 0;row< 5;row++)
{
std::map<int,TableItemInfor*> inforMap;
for(int col = 0; col< 6;col++)
{
infor = new TableItemInfor;
QString text = QString::number(col);
infor->row = row;
infor->col = col;
infor->data = text;
inforMap.insert(std::make_pair(col, infor));
}
m_tableInfor.insert(std::make_pair(row, inforMap));
}
createTable();
}
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();
}
void MainWindow::onCellOperateMenu(QPoint p)
{
m_menu->exec(QCursor::pos());
}
bool MainWindow::eventFilter(QObject *pObj, QEvent *pEvent)
{
return QObject::eventFilter(pObj, pEvent);;
}