新版布局

This commit is contained in:
xu
2026-10-16 09:06:03 +08:00
parent e5efdea06e
commit 1ec93e42cb
37 changed files with 1785 additions and 977 deletions
+38 -2
View File
@@ -1,13 +1,21 @@
#ifndef DATACARD_H
#define DATACARD_H
#include <QWidget>
#include <QString>
#include <QStringList>
#include <QVector>
#include <QWidget>
class QLabel;
class QHBoxLayout;
class QTimer;
class QEvent;
// ===================== 数据卡片 =====================
// 标题栏 + 若干“标签:值”行;支持指定字段红色闪烁告警
// 标题栏 + 若干“标签:值”行 + 一条常驻的“故障”行。
// 每行有最大高度、长到上限就停,多出来的高度归末尾弹性,所以有无故障都不改变布局;
// 字段行支持红色闪烁告警;故障行没有标签、字号 kFaultFontPx,有故障时红闪、
// 多条按 1s 轮流显示,文字比整行宽时自动滑动,无故障时内容为空(行仍占位)。
class DataCard : public QWidget
{
Q_OBJECT
@@ -18,13 +26,41 @@ public:
int addField(const QString& label, const QString& value = "--", bool big = false);
void setField(int index, const QString& value);
void setAlarm(int index, bool on);
void setFaults(const QStringList& faults); // 故障行内容(空 = 清空文字,行仍占位)
// 数值行字号。要在 addField 之前调——字号是建标签时就写进行内样式表的,改不了已建的。
// big 字段不走这个值(固定 50)。
void setValueFontPx(int px) { m_valueFontPx = px; }
void setHighlight(bool on); // 主色描边突出
void indentRows(); // 字段行整体缩进到「中间偏左」(行首 : 行尾 = 2 : 3),只需调用一次
protected:
bool eventFilter(QObject* obj, QEvent* ev) override; // 盯故障数值标签的宽度变化
private slots:
void rotateFault();
void tickFaultScroll(); // 故障文字滑动一拍
private:
void ensureFaultRow();
void applyFaultText(); // 设文字、量宽度、决定要不要滑动
void updateFaultScroll(); // 放得下就停着显示,放不下才开滑动
void positionFaultLabel(); // 按当前偏移摆放故障标签
QLabel* m_title = nullptr;
QHBoxLayout* m_faultRow = nullptr; // 构造函数里就建好,永远占着最后一行
QWidget* m_faultBox = nullptr; // 裁剪容器:文字超宽时标签在这里面左移
QLabel* m_faultValue = nullptr; // 无“故障:”标签;宽度按文字自然宽度,位置手动给
QTimer* m_faultTimer = nullptr; // 多条故障 1s 轮换
QTimer* m_scrollTimer = nullptr; // 滑动节拍
QStringList m_faults; // 当前故障列表,空 = 无故障
QString m_faultText; // 当前该显示的完整文字
int m_faultIdx = 0;
int m_textW = 0; // 当前故障文字的像素宽
int m_offset = 0; // 已左移的像素
QVector<QLabel*> m_values;
QVector<QString> m_labels;
int m_valueFontPx = 42; // 数值行字号;big 字段固定 50,不受它影响
};
#endif // DATACARD_H