#include "formhead.h" #include "ui_formhead.h" #include #include #include #include #include "CallManage.h" #include //extern int g_iRows; //extern int g_iCols; int g_iColsWidth=200; int g_iRowsHight=80; //画图头 FormHead::FormHead(QWidget *parent, int indexID) : QWidget(parent), ui(new Ui::FormHead) { ui->setupUi(this); m_indexID =indexID; //设置样式表,不显示竖直边框 ui->tableWidget->setStyleSheet( "QTableView::item {border-left: 0px solid black;} \ QTableView::item:selected {border-left: 0px solid black;}\ QTableView::item {border-right: 0px solid black;} \ QTableView::item:selected {border-right: 0px solid black;}"); // //ui->tableWidget->verticalHeader()->hide(); //行 //ui->tableWidget->horizontalHeader()->hide(); //列 ui->tableWidget->verticalHeader()->setFixedWidth(3);//标题栏宽度 ui->tableWidget->horizontalHeader()->setFixedHeight(3);//标题栏高度 //ui->tableWidget->setColumnCount(1); //动态设置列数 //ui->tableWidget->horizontalHeader()->setStretchLastSection(true);//最后一列铺满最后 //标题 // QTableWidgetItem *headerItem = new QTableWidgetItem(""); // ui->tableWidget->setHorizontalHeaderItem(0, headerItem); //我们让一列也可以滑动 ui->tableWidget->setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel); ui->tableWidget->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); // 设置右键菜单策略 ui->tableWidget->setContextMenuPolicy(Qt::CustomContextMenu); connect(ui->tableWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(slotContextMenu(QPoint))); // 在窗口构造函数中 //ui->tableWidget->installEventFilter(this); // 连接信号和槽 connect(ui->tableWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(slotContextMenu(QPoint))); } FormHead::~FormHead() { delete ui; } void FormHead::resizeWindow() { QRect rect = this->rect(); //调整大小 if(rect.width()>m_iCols*g_iColsWidth) { ui->tableWidget->setGeometry((rect.width()-(m_iCols*g_iColsWidth+1))/2, 0, m_iCols*(g_iColsWidth+1)+4, m_iRows*(g_iRowsHight+2)+4); } else { ui->tableWidget->setGeometry(0, 0, m_iCols*(g_iColsWidth+1)+4, m_iRows*(g_iRowsHight+2)+4); } } void FormHead::resizeEvent(QResizeEvent *event) { resizeWindow(); } void FormHead::Init(int iRows, int iCols, int iWidth) { m_iRows =iRows; m_iCols = iCols; //清空 ui->tableWidget->clearContents(); //ui->tableWidget->verticalHeader()->hide();//隐藏左侧系统序号栏 //ui->tableWidget->horizontalHeader()->hide();//隐藏上方系统序号栏 //ui->tableWidget->verticalHeader()->setFixedWidth(3);//标题栏宽度 //ui->tableWidget->horizontalHeader()->setFixedHeight(3);//标题栏高度 //QRect rect = this->rect(); //因为tableWidget需要提前规定好行数与列数 ui->tableWidget->setColumnCount(m_iCols);//列数 ui->tableWidget->setRowCount(m_iRows); //动态设置行数 for(int i=0; itableWidget->setRowHeight(i, g_iRowsHight); for(int j=0; jtableWidget->setColumnWidth(j, g_iColsWidth); QTableWidgetItem* item = new QTableWidgetItem(""); ui->tableWidget->setItem(i, j, item); } } } void FormHead::slotContextMenu(QPoint pos) { QMenu menu(ui->tableWidget); QAction *mergeAction = menu.addAction("合并表格"); QAction *refreshAction = menu.addAction("拆分表格"); QAction *deleteAction = menu.addAction("删除行"); QAction *addAction = menu.addAction("添加行"); // 弹出菜单 QAction *selectedAction = menu.exec(ui->tableWidget->mapToGlobal(pos)); if (selectedAction == mergeAction) { qDebug() << "合并表格"; slotMerge(); } else if (selectedAction == deleteAction) { //删除1行 int row = ui->tableWidget->currentRow(); ui->tableWidget->removeRow(row); } else if (selectedAction == refreshAction) { qDebug() << "拆分表格"; slotSplit(); } } //合并 void FormHead::slotMerge() { QModelIndexList list = ui->tableWidget->selectionModel()->selectedIndexes(); if (list.size() < 2) { QMessageBox::warning(this, "单元格合并", "所选中单元格中为单个单元格,无法合并", "确定"); return; } int topRow = 0; int leftCol = 0; int bottomRow = 0; int rightCol = 0; QList selectRanges = ui->tableWidget->selectedRanges(); if (selectRanges.size() > 0) { topRow = selectRanges[0].topRow(); leftCol = selectRanges[0].leftColumn(); bottomRow = selectRanges[0].bottomRow(); rightCol = selectRanges[0].rightColumn(); } for(auto range:selectRanges) { if(range.topRow() bottomRow) bottomRow=range.bottomRow(); if(range.rightColumn()>rightCol) rightCol=range.rightColumn(); } int rowSpan = (bottomRow - topRow) + 1; int colSpan = (rightCol - leftCol) + 1; ui->tableWidget->setSpan(topRow, leftCol, rowSpan, colSpan); } //拆分 void FormHead::slotSplit() { int row,col; QList selectRanges = ui->tableWidget->selectedRanges(); if (selectRanges.size() < 2) { QMessageBox::warning(this, "拆分表格失败", "单元格已是最小单位,不能再进行拆分", "确定"); return; } QList selectItems = ui->tableWidget->selectedItems(); if(selectItems.size()==0) { QMessageBox::warning(this, "拆分表格失败", "请先为表格设置元素item", "确定"); return; } if(selectItems.size()>1) { QMessageBox::warning(this, "拆分表格失败", "非法选择", "确定"); return; } for(auto item:selectItems) { row= item->row(); col=item->column(); } ui->tableWidget->setSpan(row, col, 1, 1); // 设置跨度为1 } bool FormHead::eventFilter(QObject* obj, QEvent* event) { if (obj == ui->tableWidget && event->type() == QEvent::KeyPress) { QKeyEvent* keyEvent = static_cast(event); if (keyEvent->matches(QKeySequence::Paste)) { onPasteExcelData(); return true; } } return QWidget::eventFilter(obj, event); } //复制粘贴事件 void FormHead::keyPressEvent(QKeyEvent * event) { //excel 行分是 "\n" ; 列分是 "\t" if (event->matches(QKeySequence::Copy)) { copy(); } else if (event->matches(QKeySequence::Paste)) { Paste(); } else if (event->matches(QKeySequence::SelectAll)) { ui->tableWidget->selectAll(); } else { QWidget::keyPressEvent(event); } } void FormHead::copy() { QMap> selMap;//行,列 QList list = ui->tableWidget->selectedItems(); if (list.count() <= 0) return; for (QTableWidgetItem* item : list) { int rowN = ui->tableWidget->row(item); int colN = ui->tableWidget->column(item); selMap[rowN].append(colN); } QString cpStr; QMap>::iterator it = selMap.begin(); while (it != selMap.end()) { for (int i = 0; i < (*it).count(); i++) { QTableWidgetItem* item = ui->tableWidget->item(it.key(), (*it).at(i)); if (item) { cpStr.append(item->text().trimmed()); } if (i != (*it).count() - 1) cpStr.append("\t"); } it++; if (it != selMap.end()) { cpStr.append("\n"); } } QApplication::clipboard()->setText(cpStr); } void FormHead::Paste() { QString pastText = QApplication::clipboard()->text(); QStringList rowList = pastText.split("\n", QString::KeepEmptyParts); if(rowList.size()==0) { return; } if(rowList.at(rowList.size()-1)=="") { rowList.removeAt(rowList.size()-1); } QTableWidgetItem* crtItem = ui->tableWidget->currentItem(); int rowN, colN; if (!crtItem) { rowN = ui->tableWidget->currentRow(); colN = ui->tableWidget->currentColumn(); } else { rowN = ui->tableWidget->row(crtItem); colN = ui->tableWidget->column(crtItem); } for (int i = 0; i < (ui->tableWidget->rowCount() - rowN) && (i < rowList.length()); i++) { QStringList rowDataList = rowList.at(i).split("\t", QString::KeepEmptyParts); for (int j = 0; j < (ui->tableWidget->columnCount() - colN) && (j < rowDataList.length()); j++) { int x = i + rowN; int y = j + colN; QTableWidgetItem* item = ui->tableWidget->item(x, y); if (item) { item->setText(rowDataList.at(j)); } else { ui->tableWidget->setItem(x, y, new QTableWidgetItem(rowDataList.at(j))); } } } } void FormHead::onPasteExcelData() { // QClipboard* clipboard = QApplication::clipboard(); // const QString clipData = clipboard->text(); // if (clipData.isEmpty()) return; // QList rowsData; // const QStringList rows = clipData.split('\n', QString::SkipEmptyParts); // for (const QString row:rows) { // rowsData << row.split('\t', QString::SkipEmptyParts); // } // QTableWidget* table = ui->tableWidget; // const QModelIndex currentIndex = table->currentIndex(); // const int startRow = currentIndex.isValid() ? currentIndex.row() : 0; // const int startCol = currentIndex.isValid() ? currentIndex.column() : 0; // table->setUpdatesEnabled(false); // table->setRowCount(std::max(table->rowCount(), startRow + rowsData.size())); // table->setColumnCount(std::max(table->columnCount(), startCol + rowsData[0].size())); // //更新行数,列数 // m_iRows = table->rowCount(); // m_iCols = table->columnCount(); // for (int i = 0; i < rowsData.size(); ++i) { // for (int j = 0; j < rowsData[i].size(); ++j) { // if (startRow + i >= table->rowCount()) break; // if (startCol + j >= table->columnCount()) break; // QTableWidgetItem* item = table->item(startRow + i, startCol + j); // if (!item) { // item = new QTableWidgetItem(); // table->setItem(startRow + i, startCol + j, item); // } // item->setText(rowsData[i][j]); // } // } // table->setUpdatesEnabled(true); // //改变大小 // resizeWindow(); }