#include "faultquery.h" #include "faulttable.h" #include #include #include #include #include #include "confirmdialog.h" #include "global.h" FaultQueryPage::FaultQueryPage(AppContext* ctx, QWidget* parent) : BasePage(ctx, parent) { m_categories << "机器人底盘" << "机械臂" << "洗消系统" << "气体检测仪"; QVBoxLayout* root = new QVBoxLayout(this); root->setContentsMargins(20, 20, 20, 20); root->setSpacing(30); // 顶条:标题 + 汇总数 m_title = label("历史故障", 50, C::TEXT, true, this); root->addWidget(m_title); QHBoxLayout* main = new QHBoxLayout(); main->setSpacing(30); // 表格 m_table = new FaultTable(this); connect(m_table, &FaultTable::rowClicked, this, &FaultQueryPage::onRowClicked); main->addWidget(m_table, 1); // 分类按钮列(左右各留 20px,按钮间距 40px,剩余高度由按钮等分) QWidget* right = new QWidget(this); QVBoxLayout* rightLay = new QVBoxLayout(right); rightLay->setContentsMargins(80, FaultTable::kHeaderHeight + 10, 30, 80); // 对齐表格内容区后再下移 10px rightLay->setSpacing(60); // 按钮之间的间隔 for (const QString& cat : m_categories) { QPushButton* b = button(cat + "故障", "", right); b->setCheckable(true); b->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding); // 纵向可拉伸 → 等分剩余空间 b->setStyleSheet(QString( "QPushButton{font-size:32px;background-color:%1;color:%2;border:1px solid %3;border-radius:12px;}" "QPushButton:hover,QPushButton:focus,QPushButton:checked" "{background-color:%4;color:#FFFFFF;border:2px solid #8ABFFF;}") .arg(C::PANEL_HI, C::TEXT, C::BORDER, C::PRIMARY)); connect(b, &QPushButton::toggled, this, &FaultQueryPage::onCategoryToggled); m_categoryButtons << b; rightLay->addWidget(b, 1); } right->setFixedWidth(360); main->addWidget(right); root->addLayout(main, 1); // 底部:返回(预留更大的行高空间) QHBoxLayout* bottomLay = new QHBoxLayout(); bottomLay->setContentsMargins(0, 0, 40, 30); bottomLay->addStretch(1); m_back = button("返回", "", this); m_back->setFixedSize(250, 100); m_back->setStyleSheet(cancelButtonStyle(60)); // 选中(悬停/按下/焦点)红底白字 connect(m_back, &QPushButton::clicked, this, [this]() { emit navigate(m_returnPage); }); bottomLay->addWidget(m_back); root->addLayout(bottomLay); // Tab 顺序(循环):表格 → 右侧分类按钮 → 返回 → 上一页 → 下一页 → 回到表格 QWidget* first = m_table->view(); QWidget* last = first; for (QPushButton* b : m_categoryButtons) { QWidget::setTabOrder(last, b); last = b; } QWidget::setTabOrder(last, m_back); QWidget::setTabOrder(m_back, m_table->prevButton()); QWidget::setTabOrder(m_table->prevButton(), m_table->nextButton()); QWidget::setTabOrder(m_table->nextButton(), first); // 回到表格,完成循环 refresh(); } void FaultQueryPage::showEvent(QShowEvent* ev) { BasePage::showEvent(ev); // 进入页面默认聚焦“分页”(上一页优先;首页禁用时退回下一页,再退回表格) QTimer::singleShot(0, this, [this]() { QWidget* prev = m_table->prevButton(); QWidget* next = m_table->nextButton(); if (prev->isEnabled()) prev->setFocus(); else if (next->isEnabled()) next->setFocus(); else m_table->view()->setFocus(); }); } void FaultQueryPage::onCategoryToggled(bool on) { // 单选:选中一个分类时,取消其它分类(屏蔽信号,避免它们再触发本函数) QPushButton* src = qobject_cast(sender()); if (on && src) { for (QPushButton* b : m_categoryButtons) { if (b != src && b->isChecked()) { b->blockSignals(true); b->setChecked(false); b->blockSignals(false); } } } // 确定当前选中的分类(都没选 = 显示全部) QString selected; for (int i = 0; i < m_categoryButtons.size(); ++i) { if (m_categoryButtons[i]->isChecked()) { selected = m_categories[i]; break; } } m_filter = selected; 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]; ConfirmDialog::message(this, "故障详情", QString("故障时间:%1\n分系统:%2\n故障代码:%3\n故障描述:%4") .arg(r.time, r.system, r.code, r.desc)); }