#include "TearingDataTableWidget.h" #include #include #include #include #include #include #include #include TearingDataTableWidget::TearingDataTableWidget(QWidget *parent) : QWidget(parent) , m_tableWidget(nullptr) { setupUI(); setupTable(); } TearingDataTableWidget::~TearingDataTableWidget() { } void TearingDataTableWidget::setupUI() { QVBoxLayout *layout = new QVBoxLayout(this); layout->setContentsMargins(0, 0, 0, 0); m_tableWidget = new QTableWidget(this); layout->addWidget(m_tableWidget); setLayout(layout); } void TearingDataTableWidget::setupTable() { // 设置表头标签 QStringList headers; // headers << "ID" << "等级" << "状态" << "类型" /*<< "起始行" << "结束行" */<< "深度" << "宽度" << "长度" << "老化"; headers << "ID" << "状态" << "类型" << "深度(mm)" << "宽度(mm)" << "长度(mm)"; // 设置表格属性 m_tableWidget->setColumnCount(headers.size()); m_tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); m_tableWidget->setSelectionMode(QAbstractItemView::SingleSelection); m_tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); m_tableWidget->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); m_tableWidget->verticalHeader()->setVisible(false); m_tableWidget->setHorizontalHeaderLabels(headers); #if 0 m_tableWidget->horizontalHeader()->setStretchLastSection(true); #else // 启用交互式列宽调整 m_tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive); // 设置列宽 m_tableWidget->setColumnWidth(0, 62); // ID列 m_tableWidget->setColumnWidth(1, 100); // 状态列 m_tableWidget->setColumnWidth(2, 80); // 类型列 m_tableWidget->setColumnWidth(3, 100); // 深度列 m_tableWidget->setColumnWidth(4, 100); // 宽度列 m_tableWidget->setColumnWidth(5, 100); // 长度列 #endif // 设置样式表 m_tableWidget->setStyleSheet( "QTableWidget {" " background-color: rgb(37,38,42);" " gridline-color: rgb(60,60,60);" " selection-background-color: rgb(80,80,80);" "}" "QTableWidget::item {" " color: white;" "}" "QHeaderView::section {" " background-color: rgb(45,45,45);" " color: white;" " padding: 4px;" "}" ); // 启用表格排序功能 m_tableWidget->setSortingEnabled(true); // 设置默认按ID列升序排序 m_tableWidget->sortItems(0, Qt::AscendingOrder); } void TearingDataTableWidget::addData(const TearingData &data) { // 查找是否已存在相同ID的行 int existingRow = findExistingRowById(data.id); int row; if (existingRow >= 0) { // 如果存在相同ID,更新该行 row = existingRow; } else { // 如果不存在,插入新行 row = m_tableWidget->rowCount(); m_tableWidget->insertRow(row); } // 使用结构体数据填充表格,状态和类型显示中文,并设置居中对齐 NumericTableWidgetItem *idItem = new NumericTableWidgetItem(data.id); idItem->setTextAlignment(Qt::AlignCenter); // ID列文字居中显示 m_tableWidget->setItem(row, 0, idItem); QTableWidgetItem *statusItem = new QTableWidgetItem(getTearStatusText(data.tearStatus)); statusItem->setTextAlignment(Qt::AlignCenter); // 状态列文字居中显示 m_tableWidget->setItem(row, 1, statusItem); QTableWidgetItem *typeItem = new QTableWidgetItem(getTearTypeText(data.tearType)); typeItem->setTextAlignment(Qt::AlignCenter); // 类型列文字居中显示 m_tableWidget->setItem(row, 2, typeItem); m_tableWidget->setItem(row, 3, new QTableWidgetItem(data.tearDepth)); m_tableWidget->setItem(row, 4, new QTableWidgetItem(data.tearWidth)); // m_tableWidget->setItem(row, 5, new QTableWidgetItem(data.tearLength)); m_tableWidget->setItem(row, 5, new QTableWidgetItem(data.statLineIdx)); // 设置item的文本颜色 for (int i = 0; i < m_tableWidget->horizontalHeader()->count(); i++) { QTableWidgetItem *item = m_tableWidget->item(row, i); if (item) { item->setForeground(QBrush(Qt::white)); } } // 保持表格按ID列排序 m_tableWidget->sortItems(0, Qt::AscendingOrder); } void TearingDataTableWidget::addData(const std::vector &dataList) { // 遍历vector中的所有数据并添加到表格 for (const auto &data : dataList) { addData(data); } } void TearingDataTableWidget::addData(const QJsonObject &json) { TearingData data = TearingData::fromJsonObject(json); addData(data); } void TearingDataTableWidget::clearData() { m_tableWidget->setRowCount(0); } QString TearingDataTableWidget::getTearStatusText(const QString &status) { // 将ESG_tearStatus枚举值转换为中文显示 if (status == "0" || status.contains("Uknown")) { return "未知"; } else if (status == "1" || status.contains("New")) { return "新发现"; } else if (status == "2" || status.contains("Growing")) { return "正在增长"; } else if (status == "3" || status.contains("Ended")) { return "撕裂结束"; } else if (status == "4" || status.contains("Invalid")) { return "无效撕裂"; } return status; // 如果无法识别,返回原值 } QString TearingDataTableWidget::getTearTypeText(const QString &type) { // 将ESG_tearType枚举值转换为中文显示 if (type == "0" || type.contains("Uknown")) { return "未知"; } else if (type == "1" || type.contains("MachineDir")) { return "纵撕"; } else if (type == "2" || type.contains("CrossWise")) { return "横撕"; } return type; // 如果无法识别,返回原值 } int TearingDataTableWidget::findExistingRowById(const QString &id) { // 在表格中查找具有相同ID的行 for (int row = 0; row < m_tableWidget->rowCount(); ++row) { QTableWidgetItem *item = m_tableWidget->item(row, 0); // ID在第0列 if (item && item->text() == id) { return row; } } return -1; // 未找到 } // NumericTableWidgetItem类的实现 NumericTableWidgetItem::NumericTableWidgetItem(const QString &text) : QTableWidgetItem(text) { } bool NumericTableWidgetItem::operator<(const QTableWidgetItem &other) const { // 尝试将文本转换为数字进行比较 double thisValue = toDouble(); double otherValue = static_cast(&other)->toDouble(); // 如果两个值都有效,则按数字比较 if (thisValue != -1 && otherValue != -1) { return thisValue < otherValue; } // 否则按默认的字符串比较 return QTableWidgetItem::operator<(other); } double NumericTableWidgetItem::toDouble() const { bool ok; // 尝试直接转换为double double value = text().toDouble(&ok); if (ok) { return value; } // 如果直接转换失败,尝试提取数字部分 QRegExp rx("(\\d+)"); if (rx.indexIn(text()) != -1) { return rx.cap(1).toDouble(&ok); } // 如果所有方法都失败,返回-1表示无效值 return -1; }