增加通讯协议
This commit is contained in:
+113
-58
@@ -1,8 +1,11 @@
|
||||
#include "paramcontrol.h"
|
||||
#include "numpaddialog.h"
|
||||
#include <QVBoxLayout>
|
||||
#include <QHBoxLayout>
|
||||
#include <QLabel>
|
||||
#include <QLineEdit>
|
||||
#include <QPushButton>
|
||||
#include <QKeyEvent>
|
||||
#include "global.h"
|
||||
|
||||
ParamControl::ParamControl(const QString& name, const QString& unit,
|
||||
@@ -16,56 +19,50 @@ ParamControl::ParamControl(const QString& name, const QString& unit,
|
||||
lay->setSpacing(6);
|
||||
|
||||
// 参数名
|
||||
QLabel* nameLabel = new QLabel(name, this);
|
||||
nameLabel->setProperty("sub", true);
|
||||
nameLabel->setStyleSheet(QString("color:%1;font-size:22px;").arg(C::TEXT_SUB));
|
||||
lay->addWidget(nameLabel);
|
||||
m_nameLabel = new QLabel(name, this);
|
||||
m_nameLabel->setProperty("sub", true);
|
||||
m_nameLabel->setStyleSheet(QString("color:%1;font-size:40px;").arg(C::TEXT_SUB));
|
||||
lay->addWidget(m_nameLabel);
|
||||
|
||||
// 数值 + 加减
|
||||
QHBoxLayout* row = new QHBoxLayout();
|
||||
row->setSpacing(12);
|
||||
// 数值输入框 + 单位(同一行;框内只显示数值)
|
||||
m_valRow = new QHBoxLayout();
|
||||
m_valRow->setSpacing(12);
|
||||
|
||||
QPushButton* minus = new QPushButton("-", this);
|
||||
minus->setFixedSize(96, 96);
|
||||
minus->setStyleSheet(QString("font-size:44px;background-color:%1;color:%2;border:1px solid %3;border-radius:12px;")
|
||||
.arg(C::PANEL_HI, C::TEXT, C::BORDER));
|
||||
connect(minus, &QPushButton::clicked, this, &ParamControl::onMinus);
|
||||
m_valueEdit = new QLineEdit(this);
|
||||
m_valueEdit->setReadOnly(true);
|
||||
m_valueEdit->setAlignment(Qt::AlignCenter);
|
||||
m_valueEdit->setFocusPolicy(Qt::StrongFocus);
|
||||
m_valueEdit->setFixedWidth(150); // 输入框长度(按需调整)
|
||||
m_valueEdit->setStyleSheet("font-size:40px;font-weight:700;");
|
||||
m_valueEdit->installEventFilter(this);
|
||||
m_valRow->addStretch(0); // 行首弹性空间:setCentered(true) 时置 1,数值行即居中
|
||||
m_valRow->addWidget(m_valueEdit);
|
||||
|
||||
m_valueLabel = new QLabel(this);
|
||||
m_valueLabel->setAlignment(Qt::AlignCenter);
|
||||
m_valueLabel->setStyleSheet(QString("color:%1;font-size:52px;font-weight:700;").arg(C::TEXT));
|
||||
m_valueLabel->setMinimumWidth(180);
|
||||
m_unitLabel = new QLabel(unit, this);
|
||||
m_unitLabel->setStyleSheet(QString("color:%1;font-size:40px;").arg(C::TEXT_SUB));
|
||||
// 同一行右侧还有按钮时,给单位固定占位,保证各参数的按钮 x 一致
|
||||
// (110 取全项目最长单位“L/min”在 40px 字号下的宽度约 101px)
|
||||
if (withSave || withFactory)
|
||||
m_unitLabel->setFixedWidth(110);
|
||||
m_valRow->addWidget(m_unitLabel);
|
||||
|
||||
QPushButton* plus = new QPushButton("+", this);
|
||||
plus->setFixedSize(96, 96);
|
||||
plus->setStyleSheet(QString("font-size:44px;background-color:%1;color:%2;border:1px solid %3;border-radius:12px;")
|
||||
.arg(C::PANEL_HI, C::TEXT, C::BORDER));
|
||||
connect(plus, &QPushButton::clicked, this, &ParamControl::onPlus);
|
||||
|
||||
row->addWidget(minus);
|
||||
row->addWidget(m_valueLabel, 1);
|
||||
row->addWidget(plus);
|
||||
lay->addLayout(row);
|
||||
|
||||
// 保存 / 恢复出厂值(可选)
|
||||
if (withSave || withFactory) {
|
||||
QHBoxLayout* btnRow = new QHBoxLayout();
|
||||
btnRow->setSpacing(12);
|
||||
if (withSave) {
|
||||
m_save = new QPushButton("保存", this);
|
||||
m_save->setProperty("variant", "primary");
|
||||
m_save->setMinimumHeight(56);
|
||||
connect(m_save, &QPushButton::clicked, this, &ParamControl::saveClicked);
|
||||
btnRow->addWidget(m_save);
|
||||
}
|
||||
if (withFactory) {
|
||||
m_factory = new QPushButton("恢复出厂值", this);
|
||||
m_factory->setMinimumHeight(56);
|
||||
connect(m_factory, &QPushButton::clicked, this, &ParamControl::factoryResetClicked);
|
||||
btnRow->addWidget(m_factory);
|
||||
}
|
||||
lay->addLayout(btnRow);
|
||||
// 保存 / 恢复出厂值(可选):跟在单位后面,与输入框同一行、整体左对齐
|
||||
if (withSave) {
|
||||
m_save = new QPushButton("保存", this);
|
||||
m_save->setProperty("variant", "primary");
|
||||
m_save->setFixedSize(140, 60); // 固定宽高,不再随布局拉伸
|
||||
connect(m_save, &QPushButton::clicked, this, &ParamControl::saveClicked);
|
||||
m_valRow->addWidget(m_save);
|
||||
}
|
||||
if (withFactory) {
|
||||
m_factory = new QPushButton("恢复出厂值", this);
|
||||
m_factory->setMinimumHeight(56);
|
||||
connect(m_factory, &QPushButton::clicked, this, &ParamControl::factoryResetClicked);
|
||||
m_valRow->addWidget(m_factory);
|
||||
}
|
||||
|
||||
m_valRow->addStretch(1);
|
||||
lay->addLayout(m_valRow);
|
||||
|
||||
refresh();
|
||||
}
|
||||
@@ -76,32 +73,90 @@ void ParamControl::setValue(double v)
|
||||
refresh();
|
||||
}
|
||||
|
||||
QWidget* ParamControl::editor() const
|
||||
{
|
||||
return m_valueEdit;
|
||||
}
|
||||
|
||||
void ParamControl::setEnabled(bool enabled)
|
||||
{
|
||||
QWidget::setEnabled(enabled);
|
||||
}
|
||||
|
||||
void ParamControl::onMinus()
|
||||
void ParamControl::setCentered(bool on)
|
||||
{
|
||||
m_value = qMax(m_min, m_value - m_step);
|
||||
refresh();
|
||||
emit valueChanged(m_value);
|
||||
m_nameLabel->setAlignment(on ? Qt::AlignCenter : (Qt::AlignLeft | Qt::AlignVCenter));
|
||||
m_valRow->setStretch(0, on ? 1 : 0); // 行首弹性空间与行尾均分 → 整行居中(含保存按钮)
|
||||
}
|
||||
|
||||
void ParamControl::onPlus()
|
||||
// 旋钮接口:steps > 0 调大、< 0 调小(每格 = m_step,自动钳位到 [min, max])
|
||||
// 目前由数值框上的 ↑/↓ 键驱动,后续接面板机械旋钮也走这里
|
||||
void ParamControl::adjustByKnob(int steps)
|
||||
{
|
||||
m_value = qMin(m_max, m_value + m_step);
|
||||
refresh();
|
||||
emit valueChanged(m_value);
|
||||
if (steps == 0)
|
||||
return;
|
||||
const double old = m_value;
|
||||
setValue(old + steps * m_step);
|
||||
if (m_value != old)
|
||||
emit valueChanged(m_value);
|
||||
}
|
||||
|
||||
// 点击数值框 / 回车 → 弹出数字键盘(面板靠左、不透明度 80%);↑/↓ → 每档加减一次
|
||||
bool ParamControl::eventFilter(QObject* obj, QEvent* ev)
|
||||
{
|
||||
if (obj == m_valueEdit) {
|
||||
if (ev->type() == QEvent::MouseButtonPress) {
|
||||
openNumPad();
|
||||
return true;
|
||||
}
|
||||
if (ev->type() == QEvent::KeyPress) {
|
||||
QKeyEvent* ke = static_cast<QKeyEvent*>(ev);
|
||||
if (ke->key() == Qt::Key_Return || ke->key() == Qt::Key_Enter) {
|
||||
openNumPad();
|
||||
return true;
|
||||
}
|
||||
// 旋钮档:↑ 加一档、↓ 减一档(每档 = m_step)。Tab/Shift+Tab 走焦点链、
|
||||
// 空格激活按钮,各不重叠;按住方向键由按键自动重复继续调
|
||||
if (ke->key() == Qt::Key_Up) {
|
||||
adjustByKnob(1);
|
||||
return true;
|
||||
}
|
||||
if (ke->key() == Qt::Key_Down) {
|
||||
adjustByKnob(-1);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return QWidget::eventFilter(obj, ev);
|
||||
}
|
||||
|
||||
void ParamControl::openNumPad()
|
||||
{
|
||||
NumPadDialog dlg(window()); // 以顶层窗口为父:遮罩覆盖整屏
|
||||
dlg.setParamMode(true); // 参数模式:回显显示实际数字,“清除”换成“小数点”
|
||||
dlg.setCompact(true); // 紧凑尺寸(不影响密码页的大键盘)
|
||||
dlg.setAnchorWidget(m_valueEdit, 20); // 面板贴在输入框左侧 20px 处弹出
|
||||
dlg.setMaxLen(6);
|
||||
dlg.setValue(m_step < 1.0 ? QString::number(m_value, 'f', 1)
|
||||
: QString::number(m_value, 'f', 0));
|
||||
if (dlg.exec() != QDialog::Accepted)
|
||||
return;
|
||||
|
||||
bool ok = false;
|
||||
const double v = dlg.value().toDouble(&ok);
|
||||
if (!ok)
|
||||
return;
|
||||
const double old = m_value;
|
||||
setValue(v);
|
||||
if (m_value != old)
|
||||
emit valueChanged(m_value);
|
||||
}
|
||||
|
||||
void ParamControl::refresh()
|
||||
{
|
||||
// 单位格式:整数不显示小数
|
||||
QString s;
|
||||
// 框内只显示数值(单位在框后面的标签里)
|
||||
if (m_step < 1.0)
|
||||
s = QString("%1").arg(m_value, 0, 'f', 1);
|
||||
m_valueEdit->setText(QString::number(m_value, 'f', 1));
|
||||
else
|
||||
s = QString("%1").arg(m_value, 0, 'f', 0);
|
||||
m_valueLabel->setText(s + " " + m_unit);
|
||||
m_valueEdit->setText(QString::number(m_value, 'f', 0));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user