首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Qt/C ++应用程序中管理度量单位换算的最佳实践

在Qt/C ++应用程序中管理度量单位换算的最佳实践
EN

Stack Overflow用户
提问于 2021-12-03 21:50:28
回答 2查看 77关注 0票数 1

在用Qt/QML和C++编写的应用程序中增加用户选择首选度量单位的可能性的最佳实践是什么?

我的案例是一个前端应用程序,它显示来自PLC的数据,还可以编辑其中的一些数据。PLC数据以毫米、克、摄氏度和米/分钟为单位,需要保留在这些单位中。

我想在前端应用程序中添加可能性,以选择是否要以毫米或英尺、摄氏度或华氏度等单位显示数据。

我在考虑一个单例QObject派生类,它以Q_PROPERTY的形式返回度量单位("mm“、"oz”等),但我不确定是否要开发一些转换值的插槽,因为当用户切换度量单位时,我不能动态更新界面。

附言:我希望避免使用boost库

EN

回答 2

Stack Overflow用户

发布于 2021-12-04 05:13:30

我不知道这是否是最佳实践,但我的处理方法是将其定义为在可编程控制器的本机数据格式和等效的用户可读QString之间进行转换的问题,然后再转换回来。

鉴于此,我可能会为一个知道如何做到这一点的类创建一个抽象接口,如下所示:

代码语言:javascript
运行
复制
class IUnitsPresentationLayer {
public:
   virtual QString lengthToString(long lengthInMillimeters) const = 0;
   virtual long stringToLength(const QString & lengthStr) const = 0;

   virtual QString temperatureToString(float temperatureCelsius) const = 0;
   virtual float stringToTemperature(const QString & tempStr) const = 0;

   [... and so on...]
};

然后,当需要显示PLC-data-value (或将用户输入的QString解析回PLC-data-value)时,可以向其余的GUI代码传递一个const IUnitsPresentationLayer *指针。实际的实现可以在一个.cpp文件中保持私有,它可以是一个单例,或者如果需要,您可以为不同的行为创建不同的IUnitsPresentationLayer-subclasses,并在必要时通过QPointerstd::shared_ptr传递它们。由于这些对象完全是常量/不可变的,因此许多GUI小部件都可以同时共享对它们的只读访问。

票数 0
EN

Stack Overflow用户

发布于 2021-12-14 07:04:43

我有一个QML Qt C++ UI。它与后端应用程序交互。

UI支持英制和公制模式。用户可以在运行时从UI中进行此选择。

用户可以通过UI查看和编辑数据值。

后端应用程序只能在英制模式下工作。

C++实用程序对象作为上下文属性公开给QML。此实用程序对象具有用于以下操作的方法:

设置并获取从英制到公制的measurement.

  • Convert

  • 字符串系统。示例:°F到°C。

  • 将数据值从英制转换为公制,将公制转换为英制。例如:华氏到摄氏度-> 50到10,摄氏度到华氏-> 0到32。

C++数据对象具有以下两个属性:

代码语言:javascript
运行
复制
Q_PROPERTY(QVariant value READ value WRITE setValue NOTIFY valueChanged)
Q_PROPERTY(QString unitString READ unitString NOTIFY unitStringChanged)
// value - In Imperial mode, you get Imperial value. In Metric mode, you get Metric value.
// unitString - In Imperial mode, you get Imperial units. In Metric mode, you get Metric units.

QVariant data::value()
{
    // fetch Imperial data value from back-end application
    // get current System of measurement
    // if current System of measurement is Metric, convert data value from Imperial to Metric
    // return data value
}

QString data::unitString()
{
    // fetch Imperial unit from back-end application
    // get current System of measurement
    // if current System of measurement is Metric, convert unit from Imperial to Metric
    // return unit
}

void data::setValue(QVariant value)
{
    // get current System of measurement
    // if current System of measurement is Metric, convert value from Metric to Imperial
    // write value to back-end Controller application
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70221037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档