调试初版

This commit is contained in:
xu
2026-10-14 18:22:41 +08:00
parent d3a355bd3f
commit e5efdea06e
26 changed files with 289 additions and 140 deletions
+31 -11
View File
@@ -62,8 +62,13 @@ FaultTable::FaultTable(QWidget* parent)
m_table->setColumnWidth(0, 120);
m_table->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch);
m_table->horizontalHeader()->setFixedHeight(kHeaderHeight); // 固定表头高度(供对齐)
// 每页 6 行等分,平均填满表格可用高度
m_table->verticalHeader()->setSectionResizeMode(QHeaderView::Stretch);
// 每页 6 行等分填满表格可用高度,行高由视口高度直接算出(见 updateRowHeights)。
// 不能用 Stretch:它不会把行压到 minimumSectionSize 之下,而该值默认取自字体度量,
// 主板上 QSS 指定的中文字体(微软雅黑等)都不存在、回退字体的行高更大,6 行塞不进
// 视口就会出滚动条、只看得到 5 行。改为固定行高后与字体无关。
m_table->verticalHeader()->setSectionResizeMode(QHeaderView::Fixed);
m_table->verticalHeader()->setMinimumSectionSize(1);
m_table->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
connect(m_table, &QTableWidget::cellClicked, this, [this](int row, int) {
int global = m_page * m_pageSize + row;
if (global >= 0 && global < m_data.size())
@@ -85,6 +90,13 @@ QWidget* FaultTable::nextButton() const { return m_next; }
bool FaultTable::eventFilter(QObject* obj, QEvent* ev)
{
// 视口尺寸变化(含首次布局)后重算行高,保证 6 行恰好铺满。
// 必须挂在 viewport 上:m_table 收到 Resize 时它的 viewport 还没重排,
// 那时读到的 viewport 高度是旧值(首次为 0)。
if (obj == m_table->viewport() && ev->type() == QEvent::Resize) {
updateRowHeights();
return QWidget::eventFilter(obj, ev);
}
if (obj == m_table->viewport() && ev->type() == QEvent::Leave) {
setHoverRow(-1); // 鼠标移出表格 → 取消悬停高亮
return QWidget::eventFilter(obj, ev);
@@ -119,17 +131,17 @@ bool FaultTable::eventFilter(QObject* obj, QEvent* ev)
return QWidget::eventFilter(obj, ev);
}
// Tab / Shift+Tab:按行切换选中(每一行作为一个单位);回车/空格:等同鼠标点击
// Tab / Shift+Tab:按行切换选中(每一行作为一个单位);空格:等同鼠标点击
if (ev->type() == QEvent::KeyPress) {
QKeyEvent* ke = static_cast<QKeyEvent*>(ev);
// 方向键在本机是"旋钮"键位(只给 ParamControl 调值),表格里不参与导航:
// 换行只走 Tab/Shift+Tab,激活只走回车/空格
if (ke->key() == Qt::Key_Up || ke->key() == Qt::Key_Down
|| ke->key() == Qt::Key_Left || ke->key() == Qt::Key_Right)
const int k = ke->key();
// 上/下方向键在本机是"旋钮"键位(只给 ParamControl 调值),表格里不参与导航:
// 换行只走 Tab/Shift+Tab,激活只走空格
if (Keys::up(k) || Keys::down(k))
return true;
if (ke->key() == Qt::Key_Tab || ke->key() == Qt::Key_Backtab) {
const bool back = (ke->key() == Qt::Key_Backtab) || (ke->modifiers() & Qt::ShiftModifier);
if (Keys::tab(k) || Keys::backtab(k)) {
const bool back = Keys::backtab(k) || Keys::shifted(ke->modifiers());
const int next = m_table->currentRow() + (back ? -1 : 1);
if (next >= 0 && next < m_table->rowCount()) {
m_table->setCurrentCell(next, qMax(0, m_table->currentColumn()));
@@ -137,8 +149,7 @@ bool FaultTable::eventFilter(QObject* obj, QEvent* ev)
return true; // 消费事件,焦点留在表格内
}
// 已在首/末行:不拦截,焦点按 Tab 顺序移到下一个控件
} else if (ke->key() == Qt::Key_Return || ke->key() == Qt::Key_Enter
|| ke->key() == Qt::Key_Space) {
} else if (Keys::space(k)) {
// 键盘激活:与鼠标 cellClicked 走同一个信号,弹窗逻辑只有一份
const int row = m_table->currentRow();
const int global = m_page * m_pageSize + row;
@@ -225,3 +236,12 @@ void FaultTable::refresh()
m_prev->setEnabled(m_page > 0);
m_next->setEnabled(m_page < pageCount() - 1);
}
// 行高 = 视口高度 / 每页行数:6 行恰好铺满,不出现滚动条,也不受字体度量影响
void FaultTable::updateRowHeights()
{
const int h = m_table->viewport()->height();
if (h <= 0 || m_pageSize <= 0)
return;
m_table->verticalHeader()->setDefaultSectionSize(qMax(1, h / m_pageSize));
}