调试初版
This commit is contained in:
@@ -14,9 +14,10 @@ DataCard::DataCard(const QString& title, QWidget* parent)
|
||||
lay->setContentsMargins(24, 0, 24, 20);
|
||||
lay->setSpacing(16);
|
||||
|
||||
// 标题栏
|
||||
// 标题栏(标题在卡片内居中,下沿一条分割线)
|
||||
m_title = new QLabel(title, this);
|
||||
m_title->setFixedHeight(60);
|
||||
m_title->setAlignment(Qt::AlignCenter);
|
||||
m_title->setProperty("cardTitle", true);
|
||||
m_title->setStyleSheet(QString("color:%1;font-size:42px;font-weight:700;border-bottom:1px solid %2;")
|
||||
.arg(C::TEXT, C::BORDER));
|
||||
|
||||
+31
-11
@@ -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));
|
||||
}
|
||||
|
||||
@@ -39,6 +39,7 @@ protected:
|
||||
|
||||
private:
|
||||
void refresh();
|
||||
void updateRowHeights(); // 行高 = 视口高度 / 每页行数,保证 6 行铺满且无滚动条
|
||||
void setHoverRow(int row); // 鼠标悬停的整行高亮
|
||||
|
||||
QTableWidget* m_table = nullptr;
|
||||
|
||||
+16
-14
@@ -139,24 +139,26 @@ void NumPadDialog::setCompact(bool on)
|
||||
}
|
||||
|
||||
// 按当前尺寸模式设置面板/按键的大小与字号,并重新摆放面板
|
||||
// 面板高度必须 ≥ 内容高度(上下边距 + 回显 + 键区 + 确认行 + 各间距),
|
||||
// 否则 QVBoxLayout 只能压缩间距,各行会互相压住。
|
||||
void NumPadDialog::applySizes()
|
||||
{
|
||||
const int digitFont = m_compact ? 40 : 50;
|
||||
const int fnFont = m_compact ? 30 : 40;
|
||||
const int dotFont = m_compact ? 46 : 60;
|
||||
const int okFont = m_compact ? 44 : 60;
|
||||
const QSize digitSz = m_compact ? QSize(120, 70) : QSize(150, 120);
|
||||
const QSize clearSz = m_compact ? QSize(120, 70) : QSize(150, 108);
|
||||
const QSize okSz = m_compact ? QSize(130, 88) : QSize(160, 140);
|
||||
const int digitFont = m_compact ? 40 : 44;
|
||||
const int fnFont = m_compact ? 30 : 34;
|
||||
const int dotFont = m_compact ? 46 : 52;
|
||||
const int okFont = m_compact ? 44 : 52;
|
||||
const QSize digitSz = m_compact ? QSize(120, 70) : QSize(132, 84);
|
||||
const QSize clearSz = m_compact ? QSize(120, 70) : QSize(132, 84);
|
||||
const QSize okSz = m_compact ? QSize(130, 88) : QSize(140, 104);
|
||||
|
||||
m_panel->setFixedSize(m_compact ? QSize(460, 600) : QSize(600, 730));
|
||||
m_panelLay->setContentsMargins(m_compact ? 20 : 24, m_compact ? 24 : 40,
|
||||
m_compact ? 20 : 24, m_compact ? 26 : 50);
|
||||
m_panelLay->setSpacing(m_compact ? 26 : 50);
|
||||
m_grid->setSpacing(m_compact ? 18 : 30);
|
||||
m_panel->setFixedSize(m_compact ? QSize(460, 600) : QSize(488, 688));
|
||||
m_panelLay->setContentsMargins(m_compact ? 20 : 24, m_compact ? 24 : 28,
|
||||
m_compact ? 20 : 24, m_compact ? 26 : 32);
|
||||
m_panelLay->setSpacing(m_compact ? 26 : 26);
|
||||
m_grid->setSpacing(m_compact ? 18 : 16);
|
||||
|
||||
m_echo->setFixedSize(m_compact ? QSize(400, 70) : QSize(510, 100));
|
||||
m_echo->setStyleSheet(QString("font-size:%1px;").arg(m_compact ? 48 : 70));
|
||||
m_echo->setFixedSize(m_compact ? QSize(400, 70) : QSize(440, 88));
|
||||
m_echo->setStyleSheet(QString("font-size:%1px;").arg(m_compact ? 48 : 56));
|
||||
|
||||
for (QPushButton* b : m_digits) {
|
||||
b->setFixedSize(digitSz);
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#include "paramcontrol.h"
|
||||
#include "numpaddialog.h"
|
||||
#include "global.h"
|
||||
#include <QVBoxLayout>
|
||||
#include <QHBoxLayout>
|
||||
#include <QLabel>
|
||||
@@ -101,7 +102,7 @@ void ParamControl::adjustByKnob(int steps)
|
||||
emit valueChanged(m_value);
|
||||
}
|
||||
|
||||
// 点击数值框 / 回车 → 弹出数字键盘(面板靠左、不透明度 80%);↑/↓ → 每档加减一次
|
||||
// 点击数值框 / 空格 → 弹出数字键盘(面板靠左、不透明度 80%);↑/↓ → 每档加减一次
|
||||
bool ParamControl::eventFilter(QObject* obj, QEvent* ev)
|
||||
{
|
||||
if (obj == m_valueEdit) {
|
||||
@@ -111,17 +112,18 @@ bool ParamControl::eventFilter(QObject* obj, QEvent* ev)
|
||||
}
|
||||
if (ev->type() == QEvent::KeyPress) {
|
||||
QKeyEvent* ke = static_cast<QKeyEvent*>(ev);
|
||||
if (ke->key() == Qt::Key_Return || ke->key() == Qt::Key_Enter) {
|
||||
const int k = ke->key();
|
||||
if (Keys::space(k)) {
|
||||
openNumPad();
|
||||
return true;
|
||||
}
|
||||
// 旋钮档:↑ 加一档、↓ 减一档(每档 = m_step)。Tab/Shift+Tab 走焦点链、
|
||||
// 空格激活按钮,各不重叠;按住方向键由按键自动重复继续调
|
||||
if (ke->key() == Qt::Key_Up) {
|
||||
// 旋钮档:↑ 加一档、↓ 减一档(每档 = m_step)。Tab/Shift+Tab 走焦点链,
|
||||
// 各不重叠;按住方向键由按键自动重复继续调
|
||||
if (Keys::up(k)) {
|
||||
adjustByKnob(1);
|
||||
return true;
|
||||
}
|
||||
if (ke->key() == Qt::Key_Down) {
|
||||
if (Keys::down(k)) {
|
||||
adjustByKnob(-1);
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user