#include "faultquery.h" #include "faulttable.h" #include #include #include #include #include #include "global.h" FaultQueryPage::FaultQueryPage(AppContext* ctx, QWidget* parent) : BasePage(ctx, parent) { m_categories << "机器人底盘" << "机械臂" << "洗消系统" << "气体检测仪"; QVBoxLayout* root = new QVBoxLayout(this); root->setContentsMargins(36, 20, 36, 20); root->setSpacing(16); // 顶条:标题 + 汇总数 m_title = label("历史故障", 28, C::TEXT, true, this); root->addWidget(m_title); QHBoxLayout* main = new QHBoxLayout(); main->setSpacing(28); // 表格 m_table = new FaultTable(this); connect(m_table, &FaultTable::rowClicked, this, &FaultQueryPage::onRowClicked); main->addWidget(m_table, 1); // 分类按钮列(垂直居中 + 平均分布) QWidget* right = new QWidget(this); QVBoxLayout* rightLay = new QVBoxLayout(right); rightLay->setContentsMargins(0, 0, 0, 0); rightLay->setSpacing(8); for (const QString& cat : m_categories) { QPushButton* b = button(cat + "故障", "", right); b->setCheckable(true); b->setFixedHeight(110); b->setStyleSheet(QString("font-size:24px;background-color:%1;color:%2;border:1px solid %3;border-radius:12px;") .arg(C::PANEL_HI, C::TEXT, C::BORDER)); connect(b, &QPushButton::toggled, this, &FaultQueryPage::onCategoryToggled); m_categoryButtons << b; rightLay->addStretch(1); rightLay->addWidget(b); } rightLay->addStretch(1); right->setFixedWidth(360); main->addWidget(right); root->addLayout(main, 1); // 底部:返回 QHBoxLayout* bottomLay = new QHBoxLayout(); bottomLay->addStretch(1); QPushButton* back = button("返回", "", this); back->setFixedSize(144, 76); connect(back, &QPushButton::clicked, this, [this]() { emit navigate(m_returnPage); }); bottomLay->addWidget(back); root->addLayout(bottomLay); refresh(); } void FaultQueryPage::onCategoryToggled(bool on) { // 单选筛选:确定当前选中的分类 QString selected; for (int i = 0; i < m_categoryButtons.size(); ++i) { if (m_categoryButtons[i]->isChecked()) { selected = m_categories[i]; break; } } m_filter = selected; Q_UNUSED(on); refresh(); } void FaultQueryPage::refresh() { // 按分类过滤 QVector data; for (const FaultRecord& r : ctx()->faultHistory) { if (m_filter.isEmpty() || r.system == m_filter) data.append(r); } m_table->setData(data); if (m_filter.isEmpty()) m_title->setText(QString("历史故障(共 %1 条)").arg(data.size())); else m_title->setText(QString("%1历史故障(共 %2 条)").arg(m_filter).arg(data.size())); } void FaultQueryPage::onRowClicked(int globalIndex) { // 找到当前过滤后列表中的记录 QVector data; for (const FaultRecord& r : ctx()->faultHistory) { if (m_filter.isEmpty() || r.system == m_filter) data.append(r); } if (globalIndex < 0 || globalIndex >= data.size()) return; const FaultRecord& r = data[globalIndex]; QMessageBox::information(this, "故障详情", QString("故障时间:%1\n分系统:%2\n故障代码:%3\n故障描述:%4") .arg(r.time, r.system, r.code, r.desc)); }