You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nmWTAI-Platform/Include/iGui/iGuiBase/iUnitWxBinder.h

164 lines
5.7 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#pragma once
#include <QObject>
#include <QLineEdit>
#include <QComboBox>
#include <QMap>
#include <QPointer>
#include <QList>
#include "zxBindWxPair.h"
// 单位控件绑定器 - 将QLineEdit和QComboBox绑定统一管理单位转换
// 每个对话框/窗口独立拥有自己的实例
class X_GUI_BASE_EXPORT iUnitWxBinder : public QObject
{
Q_OBJECT
public:
explicit iUnitWxBinder(QObject *parent = 0, QString sParaSrcTag = "");
~iUnitWxBinder();
private:
// 禁止拷贝
iUnitWxBinder(const iUnitWxBinder&);
iUnitWxBinder& operator=(const iUnitWxBinder&);
public:
/// @brief 注册单位组(根据参数进行)
/// @param pTbxValue 数值输入区
/// @param pCbxUnit 单位下拉框
/// @param sPara 绑定的参数可以为空但是不建议为空如果为空则自动根据combo已经填写的内容搜索UnitGroup
/// @param bBindWxOnly 是否仅仅绑定true这时候不重新填写数值和下拉
bool registerUnitGroup(QLineEdit* pTbxValue, \
QComboBox* pCbxUnit, \
QString sPara = "", \
bool bBindWxOnly = false);
/// @brief 注册单位组(根据参数进行,两个算比较常见的,所以单位增加一个接口)
/// @param pTbxValue1 数值输入区
/// @param pTbxValue2 数值输入区
/// @param pCbxUnit 单位下拉框
/// @param sPara 绑定的参数可以为空但是不建议为空如果为空则自动根据combo已经填写的内容搜索UnitGroup
/// @param bBindWxOnly 是否仅仅绑定true这时候不重新填写数值和下拉
bool registerUnitGroup(QLineEdit* pTbxValue1, \
QLineEdit* pTbxValue2, \
QComboBox* pCbxUnit, \
QString sPara = "", \
bool bBindWxOnly = false);
private:
// 注册单位组单个LineEdit
bool _registerUnitGroup(QLineEdit* pTbxValue, \
QComboBox* pCbxUnit, \
iUnitGroup* pUnitGroup, \
const QString& sBaseUnit, \
double dValueInit = 0.0, \
QString sPara = "", \
bool bBindWxOnly = false);
// 注册单位组多个LineEdit共用一个ComboBox
bool _registerUnitGroup(QList<QLineEdit*> listTbxValues, \
QComboBox* pCbxUnit, \
iUnitGroup* pUnitGroup, \
const QString& sBaseUnit, \
QList<double> listValueInits = QList<double>(), \
QString sPara = "", \
bool bBindWxOnly = false);
void _freshTips(zxBindWxPair* pBindPair);
public:
// 获取基准单位的数值
double getBaseValue(QLineEdit* pTbxValue) const;
double getBaseValue(QString sPara) const; //慎用,只有一对一的情形才能用
// 设置基准值(会同步更新显示)
void setBaseValue(QLineEdit* pTbxValue, double baseValue);
void setBaseValue(double baseValue);
// 获取当前单位下的显示值
double getDisplayValue(QLineEdit* pTbxValue) const;
double getDisplayValue(QString sPara) const; //慎用,只有一对一的情形才能用
QString getShowValue(QLineEdit* pTbxValue) const;
QString getShowValue(QString sPara) const; //慎用,只有一对一的情形才能用
// 获取当前单位名称
QString getCurrentUnit(QLineEdit* pTbxValue) const;
QString getBaseUnit(QString sPara) const; //慎用,只有一对一的情形才能用
// 设置当前单位(会同步转换数值)
void setCurrentUnit(QLineEdit* pTbxValue, const QString& unitName);
// 获取当前单位索引
int getCurrentUnitIndex(QLineEdit* pTbxValue) const;
// 获取单位组
iUnitGroup* getUnitGroup(QLineEdit* pTbxValue) const;
zxBindWxPair* getWxPairOf(QLineEdit* pTbxValue);
const zxBindWxPair* getWxPairOf(QLineEdit* pTbxValue) const;
zxBindWxPair* getWxPairOf(QComboBox* pCbxUnit);
const zxBindWxPair* getWxPairOf(QComboBox* pCbxUnit) const;
zxBindWxPair* getDefaultWxPair();
const zxBindWxPair* getDefaultWxPair() const;
// 这一组慎用,只有一对一情形适用
zxBindWxPair* getWxPairOf(QString sPara);
const zxBindWxPair* getWxPairOf(QString sPara) const;
// 手动触发更新显示
void updateDisplay(QLineEdit* pTbxValue);
// 移除单位组(当控件销毁时自动调用)
void removeUnitGroup(QLineEdit* pTbxValue);
// 清理所有已销毁控件的组数据
void cleanupDestroyedGroups();
QString getEditorCss(bool bValid);
QString getLastError();
// 判断输入是否OK如果为空则默认第一个
bool isInputOK(QLineEdit* pTbxValue = nullptr, \
bool bCheckOnly = true, \
double* ptrBaseValue = nullptr);
signals:
// 触发信号由外部控制是否输入OK比如参数ValidStr校验
void sigInputOK(const QString sPara, const double dBaseValue, bool& bOK);
private slots:
void onUnitChanged(int index);
void onEditingFinished();
void onWidgetDestroyed(QObject* obj);
private:
void updateDisplayInternal(zxBindWxPair* pBindPair);
int getDecimalDigitsFromUnit(zxBindWxPair* pBindPair, const QString& unitName) const;
QString formatNumber(double value, int nDigit) const;
private:
QList<zxBindWxPair*> m_listPairs;
// 参数来源标识,默认情况下,为 s_Sys_Para_Default
// 不涉及序列化
QString m_sParaSrcTag;
// Error
QString m_sError;
};