You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
AppFlow/FITK_Component/FITKWidget/FITKTableWidget.cpp

289 lines
9.2 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include "FITKTableWidget.h"
#include <QTableWidget>
#include <QMenu>
#include <QHeaderView>
#include <QKeyEvent>
#include <QLineEdit>
#include <QScrollBar>
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<QLineEdit*> lineEdits = findChildren<QLineEdit*>();
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);
}
}
}