在用Qt/QML和C++编写的应用程序中增加用户选择首选度量单位的可能性的最佳实践是什么?
我的案例是一个前端应用程序,它显示来自PLC的数据,还可以编辑其中的一些数据。PLC数据以毫米、克、摄氏度和米/分钟为单位,需要保留在这些单位中。
我想在前端应用程序中添加可能性,以选择是否要以毫米或英尺、摄氏度或华氏度等单位显示数据。
我在考虑一个单例QObject派生类,它以Q_PROPERTY的形式返回度量单位("mm“、"oz”等),但我不确定是否要开发一些转换值的插槽,因为当用户切换度量单位时,我不能动态更新界面。
附言:我希望避免使用boost库
发布于 2021-12-04 05:13:30
我不知道这是否是最佳实践,但我的处理方法是将其定义为在可编程控制器的本机数据格式和等效的用户可读QString之间进行转换的问题,然后再转换回来。
鉴于此,我可能会为一个知道如何做到这一点的类创建一个抽象接口,如下所示:
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,并在必要时通过QPointer
或std::shared_ptr
传递它们。由于这些对象完全是常量/不可变的,因此许多GUI小部件都可以同时共享对它们的只读访问。
发布于 2021-12-14 07:04:43
我有一个QML Qt C++ UI。它与后端应用程序交互。
UI支持英制和公制模式。用户可以在运行时从UI中进行此选择。
用户可以通过UI查看和编辑数据值。
后端应用程序只能在英制模式下工作。
C++实用程序对象作为上下文属性公开给QML。此实用程序对象具有用于以下操作的方法:
设置并获取从英制到公制的measurement.
C++数据对象具有以下两个属性:
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
}
https://stackoverflow.com/questions/70221037
复制相似问题