#include "FITKTableWidget.h" #include #include #include #include #include #include namespace Comp { FITKTableWidget::FITKTableWidget(QWidget * parent): QTableWidget(parent) { //TableWidget布局 this->horizontalHeader()->setDefaultAlignment(Qt::AlignCenter); //设置tableWidget的item点击即可编辑 this->setEditTriggers(QAbstractItemView::AllEditTriggers); //TableWidget自适应大小 //this->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch); //TableWidget鼠标右键事件信号连接 this->setContextMenuPolicy(Qt::CustomContextMenu); //上下文菜单信号连接 connect(this, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(handleContextMenu(const QPoint&))); ////垂直滚动条样式 //this->horizontalScrollBar()->setStyleSheet("QScrollBar{background:transparent; height:10px;}" // "QScrollBar::handle{background:lightgray; border:2px solid transparent; border-radius:5px;}" // "QScrollBar::handle:hover{background:gray;}" // "QScrollBar::sub-line{background:transparent;}" // "QScrollBar::add-line{background:transparent;}"); ////水平滚动条样式 //this->verticalScrollBar()->setStyleSheet("QScrollBar{background:transparent; width: 10px;}" // "QScrollBar::handle{background:lightgray; border:2px solid transparent; border-radius:5px;}" // "QScrollBar::handle:hover{background:gray;}" // "QScrollBar::sub-line{background:transparent;}" // "QScrollBar::add-line{background:transparent;}"); //默认添加一行数据 insertNewRow(0); } FITKTableWidget::~FITKTableWidget() { } void FITKTableWidget::setAppendLineByEnterPressed(bool isAppend) { _isAddLineByEnter = isAppend; } void FITKTableWidget::setIsAloneRow(bool isAlone) { _isAloneRow = isAlone; if (_isAloneRow) { _isAddLineByEnter = false; } else { _isAddLineByEnter = true; } } void FITKTableWidget::cutCurrentData() { //剪切当前数据 int colum = this->currentColumn(); int row = this->currentRow(); QTableWidgetItem* item = this->item(row, colum); if (item == nullptr)return; QString text = item->text(); _copyValue = text; item->setText(""); } void FITKTableWidget::copyCurrentData() { //拷贝当前数据 int colum = this->currentColumn(); int row = this->currentRow(); QTableWidgetItem* item = this->item(row, colum); if (item == nullptr)return; QString text = item->text(); _copyValue = text; } void FITKTableWidget::pasteCurrentData() { //粘贴当前数据 int colum = this->currentColumn(); int row = this->currentRow(); QTableWidgetItem* item = this->item(row, colum); if (item == nullptr)return; item->setText(_copyValue); } void FITKTableWidget::insertRowBefore() { int curRow = this->currentRow(); insertNewRow(curRow); } void FITKTableWidget::insertRowAfter() { int curRow = this->currentRow() + 1; insertNewRow(curRow); } void FITKTableWidget::deleteTableRows() { //删除一行 QItemSelection selection(this->selectionModel()->selection()); QList< int > rows; foreach(const QModelIndex& index, selection.indexes()) { int row = index.row(); if (!rows.contains(row)) { rows.append(row); } } qSort(rows); for (int i = rows.count() - 1; i >= 0; i--) { this->removeRow(rows[i]); } if (this->rowCount() == 0) { insertNewRow(0); } } void Comp::FITKTableWidget::clearContents() { //清除单元格 QTableWidgetItem* item = this->currentItem(); if (item != nullptr){ item->setText(""); } } void Comp::FITKTableWidget::clearTable() { for (int i = 0; i < this->rowCount(); i++){ for (int j = 0; j < this->columnCount(); j++) { QTableWidgetItem* item = new QTableWidgetItem(""); /*item0->setTextAlignment(Qt::AlignCenter); item1->setTextAlignment(Qt::AlignCenter);*/ this->setItem(i, j, item); } } } void Comp::FITKTableWidget::keyPressEvent(QKeyEvent * event) { QTableWidget::keyPressEvent(event); // 获取按键值,只处理enter和return键 int key = event->key(); if (key != Qt::Key_Enter && key != Qt::Key_Return) return; // 获取当前选中单元格的索引 QModelIndex index = currentIndex(); if (!index.isValid()) return; int row = index.row(); int column = index.column(); // 如果当前列不是最后一列,则移动到下一列 /*if (column < columnCount() - 1) { int nextVisiablecolumn = column + 1; while (nextVisiablecolumn < columnCount()) { if (!isColumnHidden(nextVisiablecolumn)) { setCurrentCell(row, nextVisiablecolumn); edit(index.siblingAtColumn(nextVisiablecolumn)); break; } ++nextVisiablecolumn; } }*/ // 如果当前行为非最后一行,则移动到下一行 if (row < rowCount() - 1) { setCurrentCell(row + 1, column); edit(index.sibling(row + 1, column)); } // 如果配置了按下Enter键添加新行,则添加新行 else if (_isAddLineByEnter) { insertRow(rowCount()); for (int i = colorCount() - 1; i >= 0; --i) { setItem(rowCount(), i, new QTableWidgetItem("")); } setCurrentCell(row + 1, column); edit(index.sibling(row + 1, column)); } } void Comp::FITKTableWidget::keyReleaseEvent(QKeyEvent * event) { QTableWidget::keyReleaseEvent(event); } bool Comp::FITKTableWidget::edit(const QModelIndex & index, EditTrigger trigger, QEvent * event) { auto result = QTableWidget::edit(index, trigger, event); QList lineEdits = findChildren(); for (int i = 0; i < lineEdits.size(); i++) { // 重写方法,屏蔽编辑框的右键菜单 QLineEdit* target = lineEdits.at(i); target->setContextMenuPolicy(Qt::NoContextMenu); } return result; } void FITKTableWidget::handleContextMenu(const QPoint & pos) { Q_UNUSED(pos); //TableWidget上右键事件添加 QMenu menu(this); QAction* cutAction = new QAction(tr("Cut"), &menu); connect(cutAction, SIGNAL(triggered()), this, SLOT(cutCurrentData())); menu.addAction(cutAction); QAction* copyAction = new QAction(tr("Copy"), &menu); connect(copyAction, SIGNAL(triggered()), this, SLOT(copyCurrentData())); menu.addAction(copyAction); QAction* pasteAction = new QAction(tr("Paste"), &menu); connect(pasteAction, SIGNAL(triggered()), this, SLOT(pasteCurrentData())); menu.addAction(pasteAction); menu.addSeparator(); if (!_isAloneRow) { QAction* insertBefore = new QAction(tr("Insert Row Before"), &menu); connect(insertBefore, SIGNAL(triggered()), this, SLOT(insertRowBefore())); menu.addAction(insertBefore); QAction* insertAfter = new QAction(tr("Insert Row After"), &menu); connect(insertAfter, SIGNAL(triggered()), this, SLOT(insertRowAfter())); menu.addAction(insertAfter); menu.addSeparator(); QAction* delRows = new QAction(tr("Delete Rows"), &menu); connect(delRows, SIGNAL(triggered()), this, SLOT(deleteTableRows())); QItemSelectionModel* select = this->selectionModel(); menu.addAction(delRows); if (!select->hasSelection()) { insertBefore->setEnabled(false); insertAfter->setEnabled(false); delRows->setEnabled(false); } } QAction* clrContents = new QAction(tr("Clear Contents"), &menu); connect(clrContents, SIGNAL(triggered()), this, SLOT(clearContents())); menu.addAction(clrContents); QAction* clrTable = new QAction(tr("Clear Table"), &menu); connect(clrTable, SIGNAL(triggered()), this, SLOT(clearTable())); menu.addAction(clrTable); menu.exec(QCursor::pos()); } void Comp::FITKTableWidget::insertNewRow(int row) { this->insertRow(row); for (int i = 0; i < this->columnCount(); i++) { QTableWidgetItem* item = new QTableWidgetItem(""); this->setItem(row, i, item); } } }