在用 Qt/QML 和 C 撰寫的應用程式中添加用戶選擇首選度量單位的可能性的最佳實踐是什么?
我的案例是一個前端應用程式,它顯示來自 PLC 的資料,還提供了編輯其中一些資料的可能性。PLC 資料以毫米、克、攝氏度和米每分鐘為單位,需要保留這些單位。
我想在前端應用程式中添加選擇是否要以毫米或英尺、攝氏度或華氏度等顯示資料的可能性...
我在考慮一個單獨的 QObject 派生類,它以 Q_PROPERTY 的形式回傳測量單位(“mm”、“oz”等...),但我不確定是否要開發一些轉換值的插槽,因為我不能用戶切換計量單位時動態更新界面。
PS我想避免使用boost庫
uj5u.com熱心網友回復:
我不知道這是否是最佳實踐,但我處理它的方式是將其作為在 PLC 的本機資料格式和等效的用戶可讀 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...]
};
然后,您的 GUI 代碼的其余部分可以傳遞一個const IUnitsPresentationLayer *指標,以便在需要顯示 PLC 資料值(或將用戶輸入的 QString 決議回 PLC 資料值)時使用。實際的實作可以在一個.cpp檔案中保持私有,它可以是一個單例,或者如果有必要,你可以IUnitsPresentationLayer為不同的行為創建不同的 -子類,并且可以通過QPointer或std::shared_ptr根據需要傳遞它們。由于這些物件完全是常量/不可變的,因此許多 GUI 小部件可以同時共享對它們的只讀訪問權限。
uj5u.com熱心網友回復:
我有一個 QML Qt C UI。它與后端應用程式介面。
UI 支持英制和公制模式。用戶可以在運行時從 UI 進行此選擇。
用戶可以通過 UI 查看和編輯資料值。
后端應用程式僅在英制模式下作業。
C 實用程式物件作為背景關系屬性公開給 QML。此實用程式物件具有以下方法:
- 設定和獲取測量系統。
- 將單位字串從英制轉換為公制。示例:°F 到°C。
- 將資料值從英制轉換為公制,將公制轉換為英制。示例:華氏到攝氏度 -> 50 到 10,攝氏度到華氏度 -> 0 到 32。
C 資料物件具有以下 2 個屬性:
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://www.uj5u.com/gongcheng/380485.html
