1133 lines
37 KiB
C++
1133 lines
37 KiB
C++
#include "formhead.h"
|
|
#include "ui_formhead.h"
|
|
#include <QMessageBox>
|
|
#include <QDebug>
|
|
#include <QMenu>
|
|
#include <QClipboard>
|
|
#include "CallManage.h"
|
|
#include <QTimer>
|
|
#include <QSvgRenderer>
|
|
#include <QLabel>
|
|
#include <QDateTime>
|
|
#include "backgrounddelegate.h"
|
|
#include "PropertyWidget.h"
|
|
#include "geometryutils.h"
|
|
|
|
//extern int g_iRows;
|
|
//extern int g_iCols;
|
|
|
|
extern QString g_prjname;
|
|
|
|
//标题栏宽度、高度
|
|
int g_iFixedWidth=0;//40;
|
|
int g_iFixedHeight=0;//30;
|
|
|
|
int g_iColsWidth=100;
|
|
int g_iRowsHight=40;
|
|
extern double g_dPixelPerCm;//每厘米像素数
|
|
//画图头
|
|
FormHead::FormHead(QWidget *parent, QString indexID) :
|
|
QWidget(parent),
|
|
ui(new Ui::FormHead)
|
|
{
|
|
ui->setupUi(this);
|
|
|
|
//加载样式
|
|
loadStyle(":/qrc/qss/flatgray.css");
|
|
|
|
m_indexID =indexID;
|
|
m_parent = (FormMultiHeads *)parent;
|
|
|
|
// 强制使用Qt渲染引擎
|
|
//QApplication::setAttribute(Qt::AA_UseStyleSheetPropagationInWidgetStyles, true);
|
|
//取消全局样式表
|
|
// ui->tableWidget->setStyleSheet("");
|
|
// ui->tableWidget->setAutoFillBackground(true);
|
|
|
|
//设置样式表,不显示竖直边框
|
|
// 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->setSizeAdjustPolicy(QTableWidget::AdjustToContents); //表格大小随内容改变,会占满
|
|
|
|
//
|
|
ui->tableWidget->verticalHeader()->hide(); //行
|
|
ui->tableWidget->horizontalHeader()->hide(); //列
|
|
ui->tableWidget->verticalHeader()->setFixedWidth(g_iFixedWidth);//标题栏宽度
|
|
ui->tableWidget->horizontalHeader()->setFixedHeight(g_iFixedHeight);//标题栏高度
|
|
//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->installEventFilter(this);
|
|
// 设置整个表格的委托,或者特定列的委托
|
|
//ui->tableWidget->setItemDelegate(new BackgroundDelegate(ui->tableWidget));
|
|
|
|
// 设置右键菜单策略
|
|
ui->tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);
|
|
// 连接信号和槽
|
|
connect(ui->tableWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(slotContextMenu(QPoint)));
|
|
|
|
//connect(ui->tableWidget, SIGNAL(itemClicked(QTableWidgetItem*)), this, SLOT(slotItemClicked(QTableWidgetItem*)));
|
|
}
|
|
|
|
FormHead::~FormHead()
|
|
{
|
|
delete ui;
|
|
}
|
|
|
|
void FormHead::loadStyle(const QString &qssFile)
|
|
{
|
|
//加载样式表
|
|
QString qss;
|
|
QFile file(qssFile);
|
|
if (file.open(QFile::ReadOnly)) {
|
|
//用QTextStream读取样式文件不用区分文件编码 带bom也行
|
|
QStringList list;
|
|
QTextStream in(&file);
|
|
//in.setCodec("utf-8");
|
|
while (!in.atEnd()) {
|
|
QString line;
|
|
in >> line;
|
|
list << line;
|
|
}
|
|
|
|
file.close();
|
|
qss = list.join("\n");
|
|
QString paletteColor = qss.mid(20, 7);
|
|
this->setPalette(QPalette(paletteColor));
|
|
//用时主要在下面这句
|
|
this->setStyleSheet(qss);
|
|
}
|
|
}
|
|
|
|
void FormHead::resizeWindow(bool bDelete)
|
|
{
|
|
QRect rect = this->rect();
|
|
int tempWidth = 0; //m_iCols*(g_iColsWidth+1)+g_iFixedWidth;
|
|
int tempHight = 0; //m_iRows*(g_iRowsHight+1)+g_iFixedHeight;
|
|
|
|
for(int i=0; i<ui->tableWidget->columnCount(); i++)
|
|
{
|
|
tempWidth += ui->tableWidget->columnWidth(i);
|
|
tempWidth += 1;
|
|
}
|
|
//
|
|
for(int j=0; j<ui->tableWidget->rowCount(); j++)
|
|
{
|
|
tempHight += ui->tableWidget->rowHeight(j);
|
|
tempHight += 1;
|
|
}
|
|
|
|
//调整大小
|
|
if(rect.width()>tempWidth)
|
|
{
|
|
ui->tableWidget->setGeometry((rect.width()-tempWidth)/2, 2, tempWidth, tempHight);
|
|
}
|
|
else
|
|
{
|
|
ui->tableWidget->setGeometry(0, 2, tempWidth, tempHight);
|
|
}
|
|
|
|
m_parent->resizeItem(m_indexID, tempWidth, tempHight, bDelete);
|
|
}
|
|
|
|
void FormHead::resizeEvent(QResizeEvent *event)
|
|
{
|
|
resizeWindow();
|
|
}
|
|
|
|
void FormHead::Init(int iRows, int iCols)
|
|
{
|
|
m_iRows =iRows;
|
|
m_iCols = iCols;
|
|
|
|
//清空
|
|
ui->tableWidget->clearContents();
|
|
ui->tableWidget->verticalHeader()->hide();//隐藏左侧系统序号栏
|
|
ui->tableWidget->horizontalHeader()->hide();//隐藏上方系统序号栏
|
|
ui->tableWidget->verticalHeader()->setFixedWidth(0);//标题栏宽度
|
|
ui->tableWidget->horizontalHeader()->setFixedHeight(0);//标题栏高度
|
|
|
|
//QRect rect = this->rect();
|
|
|
|
//因为tableWidget需要提前规定好行数与列数
|
|
ui->tableWidget->setColumnCount(m_iCols);//列数
|
|
ui->tableWidget->setRowCount(m_iRows); //动态设置行数
|
|
|
|
// for(int i=0; i<m_iRows; i++)
|
|
// {
|
|
// //行标题
|
|
// QTableWidgetItem *headerItem = new QTableWidgetItem("");
|
|
// ui->tableWidget->setVerticalHeaderItem(i, headerItem);
|
|
// }
|
|
// for(int j=0; j<m_iCols; j++)
|
|
// {
|
|
// //列标题
|
|
// QTableWidgetItem *headerItem = new QTableWidgetItem("");
|
|
// ui->tableWidget->setHorizontalHeaderItem(j, headerItem);
|
|
// }
|
|
|
|
for(int i=0; i<m_iRows; i++)
|
|
{
|
|
//设置高度
|
|
ui->tableWidget->setRowHeight(i, g_iRowsHight);
|
|
|
|
for(int j=0; j<m_iCols; j++)
|
|
{
|
|
//设置列宽
|
|
ui->tableWidget->setColumnWidth(j, g_iColsWidth);
|
|
|
|
double colWidth = g_iColsWidth;
|
|
double rowHeight = g_iRowsHight;
|
|
QTableWidgetItem* item = new QTableWidgetItem("");//QString::number(i) + "-" + QString::number(j)
|
|
// 将图片路径存储在Qt::UserRole+1角色中
|
|
item->setData(Qt::UserRole+1, ""); //图片路径 ./image/胜利符号库/解释结论符号/
|
|
item->setData(Qt::UserRole+2, 0); //图例宽
|
|
item->setData(Qt::UserRole+3, 0); //图例高
|
|
|
|
// 设置背景色
|
|
QColor color(255, 255, 255, 255);
|
|
QBrush HeadBrush = QBrush(color);
|
|
HeadBrush.setStyle(Qt::SolidPattern);
|
|
item->setBackground(HeadBrush);
|
|
item->setData(Qt::BackgroundRole, color); // 双重保险
|
|
// 设置字体颜色
|
|
QColor colorTxt(0, 0, 0, 255);
|
|
item->setForeground(QBrush(colorTxt));
|
|
//item->setData(Qt::UserRole, QVariant("vertical"));
|
|
//
|
|
ui->tableWidget->setItem(i, j, item);
|
|
}
|
|
}
|
|
|
|
//初始化完成后再连接信号槽,防止数据初始化时激活信号
|
|
connect(ui->tableWidget, SIGNAL(itemChanged(QTableWidgetItem*)), this, SLOT(onItemChanged(QTableWidgetItem*)));
|
|
connect(ui->tableWidget, SIGNAL(itemSelectionChanged()), this, SLOT(onItemSelectionChanged()));//曲线选中,置顶
|
|
connect(CallManage::getInstance(), SIGNAL(sig_UnSelectTableItem(QString)), this, SLOT(s_UnSelectTableItem(QString)));
|
|
}
|
|
|
|
//更新
|
|
void FormHead::updateJsonInfo(QJsonObject headObjInfo)
|
|
{
|
|
//展示其中一行
|
|
int iCols = 0;
|
|
int iRows = 0;
|
|
//
|
|
if (headObjInfo.contains("iCols"))
|
|
{
|
|
QJsonValue value = headObjInfo.value("iCols");
|
|
if (value.isDouble()) {
|
|
iCols = value.toInt();
|
|
qDebug() << "iCols:" << QString::number(iCols);
|
|
}
|
|
}
|
|
//
|
|
if (headObjInfo.contains("iRows"))
|
|
{
|
|
QJsonValue value = headObjInfo.value("iRows");
|
|
if (value.isDouble()) {
|
|
iRows = value.toInt();
|
|
qDebug() << "iRows:" << QString::number(iRows);
|
|
}
|
|
}
|
|
|
|
//
|
|
QJsonArray itemsArray;
|
|
if (headObjInfo.contains("items"))
|
|
{
|
|
QJsonValue value = headObjInfo.value("items");
|
|
if (value.isArray()) {
|
|
itemsArray = value.toArray();
|
|
qDebug() << "tracksArray number:" << QString::number(itemsArray.size());
|
|
//展示所有单元格
|
|
DisplayItems(itemsArray);
|
|
}
|
|
}
|
|
|
|
//大小改变
|
|
resizeWindow();
|
|
}
|
|
|
|
//展示所有单元格
|
|
void FormHead::DisplayItems(QJsonArray itemsArray)
|
|
{
|
|
QMap<int, int> mapItems;
|
|
|
|
int id = 0;
|
|
int iCount = itemsArray.size();
|
|
for(int i=0; i<iCount; i++)
|
|
{
|
|
QJsonValue itemValue = itemsArray[i];
|
|
|
|
QJsonObject itemObj = itemValue.toObject();
|
|
//
|
|
if (itemObj.contains("id"))
|
|
{
|
|
QJsonValue value = itemObj.value("id");
|
|
if (value.isDouble()) {
|
|
id = value.toInt();
|
|
qDebug() << "id:" << QString::number(id);
|
|
//
|
|
mapItems.insert(id, i);
|
|
}
|
|
}
|
|
}
|
|
|
|
for(int id=0; id<iCount; id++)
|
|
{
|
|
if(mapItems.contains(id))
|
|
{
|
|
int iNum = mapItems.value(id);
|
|
QJsonValue itemValue = itemsArray[iNum];
|
|
|
|
QJsonObject itemObj = itemValue.toObject();
|
|
int col=-1;
|
|
int row=-1;
|
|
//
|
|
if (itemObj.contains("col"))
|
|
{
|
|
QJsonValue value = itemObj.value("col");
|
|
if (value.isDouble()) {
|
|
col = value.toInt();
|
|
qDebug() << "col:" << QString::number(col);
|
|
}
|
|
}
|
|
//
|
|
if (itemObj.contains("row"))
|
|
{
|
|
QJsonValue value = itemObj.value("row");
|
|
if (value.isDouble()) {
|
|
row = value.toInt();
|
|
qDebug() << "row:" << QString::number(row);
|
|
}
|
|
}
|
|
|
|
if(col>-1 && row>-1)
|
|
{
|
|
QTableWidgetItem* item = ui->tableWidget->item(row, col);
|
|
//内容
|
|
if (itemObj.contains("text"))
|
|
{
|
|
QJsonValue value = itemObj.value("text");
|
|
if (value.isString()) {
|
|
QString newText = value.toString();
|
|
qDebug() << "text:" << newText;
|
|
item->setText(newText);
|
|
}
|
|
}
|
|
//字体
|
|
if (itemObj.contains("Font"))
|
|
{
|
|
QJsonValue value = itemObj.value("Font");
|
|
QFont newFont;
|
|
newFont.fromString(value.toString());
|
|
item->setFont(newFont);
|
|
}
|
|
//字体颜色
|
|
if (itemObj.contains("FontColor"))
|
|
{
|
|
QJsonValue value = itemObj.value("FontColor");
|
|
QColor newColor;
|
|
newColor.setNamedColor(value.toString());
|
|
// 设置字体颜色
|
|
QBrush brush(newColor);
|
|
item->setForeground(brush);
|
|
}
|
|
//背景颜色
|
|
if (itemObj.contains("backColor"))
|
|
{
|
|
QJsonValue value = itemObj.value("backColor");
|
|
QColor newColor;
|
|
newColor.setNamedColor(value.toString());
|
|
// 设置颜色
|
|
QBrush brush(newColor);
|
|
item->setBackground(brush);
|
|
}
|
|
//列宽(cm)
|
|
double colWidth = 0;
|
|
double rowHeight = 0;
|
|
if (itemObj.contains("colWidth"))
|
|
{
|
|
QJsonValue value = itemObj.value("colWidth");
|
|
if (value.isDouble()) {
|
|
colWidth = value.toDouble();
|
|
qDebug() << "colWidth:" << QString::number(colWidth);
|
|
ui->tableWidget->setColumnWidth(col, colWidth*g_dPixelPerCm);
|
|
}
|
|
}
|
|
//行高
|
|
if (itemObj.contains("rowHeight"))
|
|
{
|
|
QJsonValue value = itemObj.value("rowHeight");
|
|
if (value.isDouble()) {
|
|
rowHeight = value.toDouble();
|
|
qDebug() << "rowHeight:" << QString::number(rowHeight);
|
|
ui->tableWidget->setRowHeight(row, rowHeight*g_dPixelPerCm);
|
|
}
|
|
}
|
|
|
|
//图例
|
|
QString imagePath = "";
|
|
double colWidth_Img = 0;
|
|
double rowHeight_Img = 0;
|
|
if (itemObj.contains("imagePath"))
|
|
{
|
|
QJsonValue value = itemObj.value("imagePath");
|
|
if (value.isString()) {
|
|
imagePath = value.toString();
|
|
qDebug() << "imagePath:" << imagePath;
|
|
item->setData(Qt::UserRole+1, imagePath); // 图片路径
|
|
}
|
|
}
|
|
//图例宽(cm)
|
|
if (itemObj.contains("colWidth_Img"))
|
|
{
|
|
QJsonValue value = itemObj.value("colWidth_Img");
|
|
if (value.isDouble()) {
|
|
colWidth_Img = value.toDouble();
|
|
qDebug() << "colWidth_Img:" << QString::number(colWidth_Img);
|
|
item->setData(Qt::UserRole+2, colWidth_Img);
|
|
}
|
|
}
|
|
//图例高(cm)
|
|
if (itemObj.contains("rowHeight_Img"))
|
|
{
|
|
QJsonValue value = itemObj.value("rowHeight_Img");
|
|
if (value.isDouble()) {
|
|
rowHeight_Img = value.toDouble();
|
|
qDebug() << "rowHeight_Img:" << QString::number(rowHeight_Img);
|
|
item->setData(Qt::UserRole+3, rowHeight_Img);
|
|
}
|
|
}
|
|
if(imagePath != "")
|
|
{
|
|
//图例
|
|
ChangHeadItemProperty(row, col, imagePath, colWidth_Img*g_dPixelPerCm, rowHeight_Img*g_dPixelPerCm);
|
|
}
|
|
|
|
//合并单元格
|
|
int rowSpan = 1;
|
|
int colSpan = 1;
|
|
if (itemObj.contains("rowSpan"))
|
|
{
|
|
QJsonValue value = itemObj.value("rowSpan");
|
|
if (value.isDouble()) {
|
|
rowSpan = value.toInt();
|
|
qDebug() << "rowSpan:" << QString::number(rowSpan);
|
|
}
|
|
}
|
|
if (itemObj.contains("columnSpan"))
|
|
{
|
|
QJsonValue value = itemObj.value("columnSpan");
|
|
if (value.isDouble()) {
|
|
colSpan = value.toInt();
|
|
qDebug() << "colSpan:" << QString::number(colSpan);
|
|
}
|
|
}
|
|
if(rowSpan > 1 || colSpan > 1)
|
|
{
|
|
int rowSpanCurrent = 0;
|
|
int columnSpanCurrent = 0;
|
|
rowSpanCurrent = ui->tableWidget->rowSpan(row, col);
|
|
columnSpanCurrent = ui->tableWidget->columnSpan(row, col);
|
|
if(rowSpanCurrent > 1 || columnSpanCurrent > 1)
|
|
{
|
|
//已经合并过,不再合并
|
|
}
|
|
else {
|
|
//合并单元格
|
|
ui->tableWidget->setSpan(row, col, rowSpan, colSpan);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
void FormHead::ChangHeadItemProperty(int iRow, int iCol, QString imagePath, int colWidth, int rowHeight)
|
|
{
|
|
//清空
|
|
ui->tableWidget->setCellWidget(iRow, iCol, nullptr);
|
|
|
|
if(imagePath!="")
|
|
{
|
|
if(imagePath.size()>4)
|
|
{
|
|
//
|
|
QString strLast = imagePath.right(4);
|
|
if(strLast.toLower()==".svg")
|
|
{
|
|
//
|
|
QSvgRenderer* svgRender = new QSvgRenderer();
|
|
svgRender->load(imagePath);
|
|
//
|
|
QPixmap* pixmap = new QPixmap(colWidth-1, rowHeight-1);
|
|
pixmap->fill(Qt::transparent);//设置背景透明
|
|
QPainter p(pixmap);
|
|
svgRender->render(&p);
|
|
//1.直接采用控件显示
|
|
QLabel* label = new QLabel;
|
|
label->setPixmap(*pixmap);
|
|
label->setAlignment(Qt::AlignHCenter);
|
|
label->show();
|
|
//
|
|
ui->tableWidget->setCellWidget(iRow, iCol, label);
|
|
|
|
//m_item->setIcon(QIcon(*pixmap));
|
|
// 设置背景刷
|
|
//QBrush brush(*pixmap);
|
|
//m_item->setBackground(brush);
|
|
//m_tableWidget->setItem(m_iRow, m_iCol, new QTableWidgetItem(QIcon(*pixmap),tr("")));
|
|
}
|
|
else if(strLast.toLower()==".png")
|
|
{
|
|
// 加载图片
|
|
QPixmap pixmap(imagePath);
|
|
//pixmap.scaled(colWidth-1, rowHeight-1, Qt::KeepAspectRatio, Qt::SmoothTransformation);//缩放
|
|
//1.直接采用控件显示
|
|
QLabel* label = new QLabel;
|
|
label->setPixmap(pixmap.scaled(colWidth-1, rowHeight-1, Qt::KeepAspectRatio, Qt::SmoothTransformation));//图片保持比例缩放
|
|
label->setAlignment(Qt::AlignHCenter);
|
|
label->show();
|
|
//
|
|
ui->tableWidget->setCellWidget(iRow, iCol, label);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
QJsonObject FormHead::makeJson()
|
|
{
|
|
int columnCount = ui->tableWidget->columnCount();//总列数
|
|
int rowCount = ui->tableWidget->rowCount();//总行数
|
|
|
|
// 创建根对象
|
|
QJsonObject rootObj;
|
|
//
|
|
rootObj["indexID"] = m_indexID;
|
|
rootObj["iRows"] = rowCount;
|
|
rootObj["iCols"] = columnCount;
|
|
//
|
|
int id=0;
|
|
QJsonArray subcaseArray;
|
|
for(int col=0; col<columnCount; col++)
|
|
{
|
|
for(int row=0; row<rowCount; row++)
|
|
{
|
|
QTableWidgetItem* item = ui->tableWidget->item(row, col);
|
|
|
|
QJsonObject formHeadObj;
|
|
formHeadObj["id"] = id;
|
|
formHeadObj["row"] = row;
|
|
formHeadObj["col"] = col;
|
|
id++;
|
|
if(item)
|
|
{
|
|
//图例
|
|
QString imagePath = "";
|
|
//图头, 图例宽高
|
|
double my_colWidth_Img = 1;
|
|
double my_rowHeight_Img = 1;
|
|
//图头, 行高、列宽
|
|
double my_colWidth = 1;
|
|
double my_rowHeight = 1;
|
|
|
|
QVariant bgData = item->data(Qt::UserRole+1); // 我们约定用这个角色存储图片路径
|
|
if (bgData.isValid()) {
|
|
imagePath = bgData.toString();
|
|
}
|
|
//图例宽
|
|
QVariant colWidth_Img = item->data(Qt::UserRole+2);
|
|
if (colWidth_Img.isValid()) {
|
|
my_colWidth_Img = colWidth_Img.toDouble();
|
|
}
|
|
//图例高
|
|
QVariant rowHeight_Img = item->data(Qt::UserRole+3);
|
|
if (rowHeight_Img.isValid()) {
|
|
my_rowHeight_Img = rowHeight_Img.toDouble();
|
|
}
|
|
|
|
//行高、列宽
|
|
my_colWidth = ui->tableWidget->columnWidth(col)/g_dPixelPerCm;
|
|
my_rowHeight = ui->tableWidget->rowHeight(row)/g_dPixelPerCm;
|
|
|
|
int rowSpan = 0;
|
|
int columnSpan = 0;
|
|
rowSpan = ui->tableWidget->rowSpan(row, col);
|
|
columnSpan = ui->tableWidget->columnSpan(row, col);
|
|
|
|
//----------------
|
|
formHeadObj["imagePath"] = imagePath;
|
|
formHeadObj["colWidth_Img"] = my_colWidth_Img;
|
|
formHeadObj["rowHeight_Img"] = my_rowHeight_Img;
|
|
formHeadObj["backColor"] = item->background().color().name();//背景颜色
|
|
formHeadObj["text"] = item->text();
|
|
formHeadObj["Font"] = item->font().toString();
|
|
formHeadObj["FontColor"] = item->foreground().color().name();
|
|
formHeadObj["colWidth"] = my_colWidth;
|
|
formHeadObj["rowHeight"] = my_rowHeight;
|
|
formHeadObj["rowSpan"] = rowSpan;
|
|
formHeadObj["columnSpan"] = columnSpan;
|
|
|
|
}
|
|
subcaseArray.append(formHeadObj);
|
|
}
|
|
}
|
|
rootObj["items"]=subcaseArray;
|
|
|
|
return rootObj;
|
|
}
|
|
|
|
//图头、成果表
|
|
//取消其他表格的选中状态
|
|
void FormHead::s_UnSelectTableItem(QString strUuid)
|
|
{
|
|
if(strUuid==m_indexID)
|
|
{
|
|
return;
|
|
}
|
|
//取消表格的选中状态
|
|
ui->tableWidget->clearSelection();
|
|
}
|
|
|
|
void FormHead::slotItemClicked(QTableWidgetItem* item)
|
|
{
|
|
if (item) {
|
|
// 获取行和列索引
|
|
int row = item->row();
|
|
int column = item->column();
|
|
if(row>=0 && column>=0)
|
|
{
|
|
PropertyService()->initHeadProperty(this, ui->tableWidget, item, row, column);
|
|
//取消其他表格的选中状态
|
|
emit CallManage::getInstance()->sig_UnSelectTableItem(m_indexID);
|
|
}
|
|
}
|
|
}
|
|
|
|
void FormHead::onItemSelectionChanged()
|
|
{
|
|
QTableWidgetItem* item = ui->tableWidget->currentItem();
|
|
if (item) {
|
|
// 获取行和列索引
|
|
int row = item->row();
|
|
int column = item->column();
|
|
if(row>=0 && column>=0)
|
|
{
|
|
PropertyService()->initHeadProperty(this, ui->tableWidget, item, row, column);
|
|
//取消其他表格的选中状态
|
|
emit CallManage::getInstance()->sig_UnSelectTableItem(m_indexID);
|
|
}
|
|
}
|
|
}
|
|
|
|
void FormHead::onItemChanged(QTableWidgetItem* item)
|
|
{
|
|
if(m_bRefresh==false)
|
|
{
|
|
//针对属性页修改了内容,避免重复刷新属性页
|
|
m_bRefresh=true;
|
|
return;
|
|
}
|
|
|
|
if (item) {
|
|
// 获取行和列索引
|
|
int row = item->row();
|
|
int column = item->column();
|
|
if(row>=0 && column>=0)
|
|
{
|
|
PropertyService()->initHeadProperty(this, ui->tableWidget, item, row, column);
|
|
//取消其他表格的选中状态
|
|
emit CallManage::getInstance()->sig_UnSelectTableItem(m_indexID);
|
|
}
|
|
}
|
|
}
|
|
|
|
void FormHead::slotContextMenu(QPoint pos)
|
|
{
|
|
QMenu menu(ui->tableWidget);
|
|
menu.addAction(QIcon(::GetImagePath() + "icon/MergeCell.png"), "合并单元格", this, &FormHead::slotMerge);
|
|
menu.addAction(QIcon(::GetImagePath() + "icon/Grid.png"), "拆分单元格", this, &FormHead::slotSplit);
|
|
menu.addSeparator();
|
|
menu.addAction(QIcon(::GetImagePath() + "icon/AddRow.png"), "前插入行", this, &FormHead::slotAddRow);
|
|
menu.addAction(QIcon(::GetImagePath() + "icon/AddRow.png"), "后插入行", this, &FormHead::slotAddAfterRow);
|
|
menu.addSeparator();
|
|
menu.addAction(QIcon(::GetImagePath() + "icon/AddColumn.png"), "前插入列", this, &FormHead::slotAddCol);
|
|
menu.addAction(QIcon(::GetImagePath() + "icon/AddColumn.png"), "后插入列", this, &FormHead::slotAddAfterCol);
|
|
menu.addSeparator();
|
|
menu.addAction(QIcon(::GetImagePath() + "icon/DelRow.png"), "删除行", this, &FormHead::slotDeleteRow);
|
|
menu.addAction(QIcon(::GetImagePath() + "icon/DelColumn.png"), "删除列", this, &FormHead::slotDeleteCol);
|
|
menu.addAction(QIcon(::GetImagePath() + "icon/DeleteTable.png"), "删除表", this, &FormHead::slotDeleteTable);
|
|
menu.exec(ui->tableWidget->mapToGlobal(pos));
|
|
}
|
|
|
|
//合并
|
|
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<QTableWidgetSelectionRange> 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()<topRow)
|
|
topRow=range.topRow();
|
|
if(range.leftColumn()<leftCol)
|
|
leftCol=range.leftColumn();
|
|
if(range.bottomRow()> 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<QTableWidgetSelectionRange> selectRanges = ui->tableWidget->selectedRanges();
|
|
if (selectRanges.size() < 2)
|
|
{
|
|
QMessageBox::warning(this, "拆分表格失败", "单元格已是最小单位,不能再进行拆分", "确定");
|
|
return;
|
|
}
|
|
QList<QTableWidgetItem*> 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
|
|
}
|
|
|
|
//前插入行
|
|
void FormHead::slotAddRow()
|
|
{
|
|
int row = ui->tableWidget->currentRow();
|
|
ui->tableWidget->insertRow(row);
|
|
|
|
//新插入行,单元格初始化
|
|
int iCols = ui->tableWidget->columnCount();
|
|
for(int j=0; j<iCols; j++)
|
|
{
|
|
QTableWidgetItem* item = new QTableWidgetItem("");
|
|
// 将图片路径存储在Qt::UserRole+1角色中
|
|
item->setData(Qt::UserRole+1, ""); //图片路径 ./image/胜利符号库/解释结论符号/
|
|
item->setData(Qt::UserRole+2, 0); //图例宽
|
|
item->setData(Qt::UserRole+3, 0); //图例高
|
|
|
|
// 设置背景色
|
|
QColor color(255, 255, 255, 255);
|
|
QBrush HeadBrush = QBrush(color);
|
|
HeadBrush.setStyle(Qt::SolidPattern);
|
|
item->setBackground(HeadBrush);
|
|
item->setData(Qt::BackgroundRole, color); // 双重保险
|
|
// 设置字体颜色
|
|
QColor colorTxt(0, 0, 0, 255);
|
|
item->setForeground(QBrush(colorTxt));
|
|
//item->setData(Qt::UserRole, QVariant("vertical"));
|
|
//
|
|
ui->tableWidget->setItem(row, j, item);
|
|
}
|
|
|
|
//改变大小
|
|
resizeWindow();
|
|
}
|
|
|
|
//后插入行
|
|
void FormHead::slotAddAfterRow()
|
|
{
|
|
int row = ui->tableWidget->currentRow();
|
|
ui->tableWidget->insertRow(row+1);
|
|
|
|
//新插入行,单元格初始化
|
|
int iCols = ui->tableWidget->columnCount();
|
|
for(int j=0; j<iCols; j++)
|
|
{
|
|
QTableWidgetItem* item = new QTableWidgetItem("");
|
|
// 将图片路径存储在Qt::UserRole+1角色中
|
|
item->setData(Qt::UserRole+1, ""); //图片路径 ./image/胜利符号库/解释结论符号/
|
|
item->setData(Qt::UserRole+2, 0); //图例宽
|
|
item->setData(Qt::UserRole+3, 0); //图例高
|
|
|
|
// 设置背景色
|
|
QColor color(255, 255, 255, 255);
|
|
QBrush HeadBrush = QBrush(color);
|
|
HeadBrush.setStyle(Qt::SolidPattern);
|
|
item->setBackground(HeadBrush);
|
|
item->setData(Qt::BackgroundRole, color); // 双重保险
|
|
// 设置字体颜色
|
|
QColor colorTxt(0, 0, 0, 255);
|
|
item->setForeground(QBrush(colorTxt));
|
|
//item->setData(Qt::UserRole, QVariant("vertical"));
|
|
//
|
|
ui->tableWidget->setItem(row+1, j, item);
|
|
}
|
|
|
|
//改变大小
|
|
resizeWindow();
|
|
}
|
|
|
|
//前插入列
|
|
void FormHead::slotAddCol()
|
|
{
|
|
int col = ui->tableWidget->currentColumn();
|
|
ui->tableWidget->insertColumn(col);
|
|
|
|
//新插入行,单元格初始化
|
|
int iRows = ui->tableWidget->rowCount();
|
|
for(int j=0; j<iRows; j++)
|
|
{
|
|
QTableWidgetItem* item = new QTableWidgetItem("");
|
|
// 将图片路径存储在Qt::UserRole+1角色中
|
|
item->setData(Qt::UserRole+1, ""); //图片路径 ./image/胜利符号库/解释结论符号/
|
|
item->setData(Qt::UserRole+2, 0); //图例宽
|
|
item->setData(Qt::UserRole+3, 0); //图例高
|
|
|
|
// 设置背景色
|
|
QColor color(255, 255, 255, 255);
|
|
QBrush HeadBrush = QBrush(color);
|
|
HeadBrush.setStyle(Qt::SolidPattern);
|
|
item->setBackground(HeadBrush);
|
|
item->setData(Qt::BackgroundRole, color); // 双重保险
|
|
// 设置字体颜色
|
|
QColor colorTxt(0, 0, 0, 255);
|
|
item->setForeground(QBrush(colorTxt));
|
|
//item->setData(Qt::UserRole, QVariant("vertical"));
|
|
//
|
|
ui->tableWidget->setItem(j, col, item);
|
|
}
|
|
|
|
//改变大小
|
|
resizeWindow();
|
|
}
|
|
|
|
//后插入列
|
|
void FormHead::slotAddAfterCol()
|
|
{
|
|
int col = ui->tableWidget->currentColumn();
|
|
ui->tableWidget->insertColumn(col+1);
|
|
|
|
//新插入行,单元格初始化
|
|
int iRows = ui->tableWidget->rowCount();
|
|
for(int j=0; j<iRows; j++)
|
|
{
|
|
QTableWidgetItem* item = new QTableWidgetItem("");
|
|
// 将图片路径存储在Qt::UserRole+1角色中
|
|
item->setData(Qt::UserRole+1, ""); //图片路径 ./image/胜利符号库/解释结论符号/
|
|
item->setData(Qt::UserRole+2, 0); //图例宽
|
|
item->setData(Qt::UserRole+3, 0); //图例高
|
|
|
|
// 设置背景色
|
|
QColor color(255, 255, 255, 255);
|
|
QBrush HeadBrush = QBrush(color);
|
|
HeadBrush.setStyle(Qt::SolidPattern);
|
|
item->setBackground(HeadBrush);
|
|
item->setData(Qt::BackgroundRole, color); // 双重保险
|
|
// 设置字体颜色
|
|
QColor colorTxt(0, 0, 0, 255);
|
|
item->setForeground(QBrush(colorTxt));
|
|
//item->setData(Qt::UserRole, QVariant("vertical"));
|
|
//
|
|
ui->tableWidget->setItem(j, col+1, item);
|
|
}
|
|
|
|
//改变大小
|
|
resizeWindow();
|
|
}
|
|
|
|
//删除行
|
|
void FormHead::slotDeleteRow()
|
|
{
|
|
//删除1行
|
|
int row = ui->tableWidget->currentRow();
|
|
ui->tableWidget->removeRow(row);
|
|
|
|
int rowCount = ui->tableWidget->rowCount();
|
|
if(rowCount==0)
|
|
{
|
|
//改变大小,并删除父窗口的对应行
|
|
resizeWindow(true);
|
|
}
|
|
else {
|
|
//改变大小
|
|
resizeWindow(false);
|
|
}
|
|
}
|
|
|
|
//删除列
|
|
void FormHead::slotDeleteCol()
|
|
{
|
|
//删除1列
|
|
int col = ui->tableWidget->currentColumn();
|
|
ui->tableWidget->removeColumn(col);
|
|
|
|
int colCount = ui->tableWidget->columnCount();
|
|
if(colCount==0)
|
|
{
|
|
//改变大小,并删除父窗口的对应行
|
|
resizeWindow(true);
|
|
}
|
|
else {
|
|
//改变大小
|
|
resizeWindow(false);
|
|
}
|
|
}
|
|
|
|
//删除表
|
|
void FormHead::slotDeleteTable()
|
|
{
|
|
//删除
|
|
ui->tableWidget->clear();
|
|
//改变大小,并删除父窗口的对应行
|
|
resizeWindow(true);
|
|
}
|
|
|
|
bool FormHead::eventFilter(QObject* obj, QEvent* event)
|
|
{
|
|
if (obj == ui->tableWidget && event->type() == QEvent::KeyPress) {
|
|
QKeyEvent* keyEvent = static_cast<QKeyEvent*>(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<int, QList<int>> selMap;//行,列
|
|
QList<QTableWidgetItem*> 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<int, QList<int>>::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()
|
|
{
|
|
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);
|
|
}
|
|
|
|
bool bImg=false;
|
|
QPixmap pixmap = QApplication::clipboard()->pixmap();
|
|
if(pixmap.isNull())
|
|
{
|
|
}
|
|
else
|
|
{
|
|
bImg=true;
|
|
|
|
//1.直接采用控件显示
|
|
QLabel* label = new QLabel;
|
|
label->setPixmap(pixmap);
|
|
label->setAlignment(Qt::AlignHCenter);
|
|
label->show();
|
|
ui->tableWidget->setCellWidget(rowN, colN, label);
|
|
|
|
// 保存为PNG文件
|
|
QString strImg = QDateTime::currentDateTime().toString("yyyyMMdd-hhmmsszzz");
|
|
//Logdata
|
|
QString folderPath;
|
|
folderPath = GetLogdataPath();
|
|
folderPath = folderPath + g_prjname;
|
|
folderPath = folderPath + "/" + strImg + ".png";
|
|
pixmap.save(folderPath, "PNG");
|
|
|
|
//
|
|
QTableWidgetItem* item = ui->tableWidget->item(rowN, colN);
|
|
// 将图片路径存储在Qt::UserRole+1角色中
|
|
item->setData(Qt::UserRole+1, folderPath); // 图片路径
|
|
item->setData(Qt::UserRole+2, pixmap.width()/g_dPixelPerCm); //图例宽
|
|
item->setData(Qt::UserRole+3, pixmap.height()/g_dPixelPerCm); //图例高
|
|
PropertyService()->initHeadProperty(this, ui->tableWidget, item, rowN, colN);
|
|
//取消其他表格的选中状态
|
|
emit CallManage::getInstance()->sig_UnSelectTableItem(m_indexID);
|
|
return;
|
|
}
|
|
|
|
QString pastText = QApplication::clipboard()->text();
|
|
QStringList rowList = pastText.split("\n", QString::KeepEmptyParts);
|
|
if(rowList.size()==0)
|
|
{
|
|
if(pixmap.isNull())
|
|
{
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
bImg=true;
|
|
}
|
|
}
|
|
|
|
if(rowList.at(rowList.size()-1)=="")
|
|
{
|
|
rowList.removeAt(rowList.size()-1);
|
|
}
|
|
|
|
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<QStringList> 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();
|
|
}
|
|
|