<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      QtQuick中弧度與角度切換管理

      在QtQuick中實現角度與弧度的自動切換:

      1. 創建角度/弧度管理類 (AngleRadiansManager)

      // anglemanager.h
      #include <QObject>
      #include <cmath>
      
      class AngleManager : public QObject {
          Q_OBJECT
          Q_PROPERTY(bool useDegrees READ useDegrees WRITE setUseDegrees NOTIFY useDegreesChanged)
      
      public:
          explicit AngleManager(QObject *parent = nullptr);
      
          bool useDegrees() const;
          void setUseDegrees(bool useDegrees);
      
          // 核心轉換函數
          Q_INVOKABLE double toDisplayUnit(double value, bool isStoredInRadians) const;
          Q_INVOKABLE double fromDisplayUnit(double displayValue, bool storeAsRadians) const;
      
      signals:
          void useDegreesChanged();
      
      private:
          bool m_useDegrees = true; // 默認顯示角度
      };
      
      // anglemanager.cpp
      #include "anglemanager.h"
      
      AngleManager::AngleManager(QObject *parent) : QObject(parent) {}
      
      bool AngleManager::useDegrees() const { return m_useDegrees; }
      
      void AngleManager::setUseDegrees(bool useDegrees) {
          if (m_useDegrees != useDegrees) {
              m_useDegrees = useDegrees;
              emit useDegreesChanged();
          }
      }
      
      double AngleManager::toDisplayUnit(double value, bool isStoredInRadians) const {
          if (m_useDegrees && isStoredInRadians) {
              return qRadiansToDegrees(value); // 弧度 -> 角度
          } else if (!m_useDegrees && !isStoredInRadians) {
              return qDegreesToRadians(value); // 角度 -> 弧度
          }
          return value; // 不需要轉換
      }
      
      double AngleManager::fromDisplayUnit(double displayValue, bool storeAsRadians) const {
          if (m_useDegrees && storeAsRadians) {
              return qDegreesToRadians(displayValue); // 顯示角度 → 存儲弧度
          } else if (!m_useDegrees && !storeAsRadians) {
              return qRadiansToDegrees(displayValue); // 顯示弧度 → 存儲角度
          }
          return displayValue; // 不需要轉換
      }
      

      2. 注冊到QML上下文

      // main.cpp
      #include "anglemanager.h"
      
      int main(int argc, char *argv[]) {
          QGuiApplication app(argc, argv);
          
          AngleManager angleManager;
          QQmlApplicationEngine engine;
          
          // 注冊單例管理類
          engine.rootContext()->setContextProperty("angleManager", &angleManager);
          
          engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
          return app.exec();
      }
      

      3. QML控件實現

      // 切換按鈕
      Switch {
          text: qsTr("角度模式")
          checked: angleManager.useDegrees
          onToggled: angleManager.setUseDegrees(checked)
      }
      
      // 使用示例1: 顯示角度值(內部存儲為弧度)
      TextInput {
          property double angleRadians: Math.PI / 4  // 內部始終以弧度存儲
          
          text: angleManager.toDisplayUnit(angleRadians, true).toFixed(2)
          validator: DoubleValidator {}
          
          onTextEdited: {
              var val = parseFloat(text);
              if (!isNaN(val)) {
                  angleRadians = angleManager.fromDisplayUnit(val, true);
              }
          }
      }
      
      // 使用示例2: 顯示角度值(內部存儲為角度)
      TextInput {
          property double angleDegrees: 45  // 內部始終以角度存儲
          
          text: angleManager.toDisplayUnit(angleDegrees, false).toFixed(2)
          validator: DoubleValidator {}
          
          onTextEdited: {
              var val = parseFloat(text);
              if (!isNaN(val)) {
                  angleDegrees = angleManager.fromDisplayUnit(val, false);
              }
          }
      }
      
      // 單位標簽
      Text {
          text: angleManager.useDegrees ? "°" : "rad"
      }
      

      4. 高級用法 - 創建可重用組件

      // SmartAngleInput.qml
      Item {
          property double value: 0
          property bool storeAsRadians: true  // 聲明內部存儲格式
          
          TextInput {
              id: inputField
              text: angleManager.toDisplayUnit(parent.value, parent.storeAsRadians).toFixed(2)
              validator: DoubleValidator {}
              
              onTextEdited: {
                  var val = parseFloat(text);
                  if (!isNaN(val)) {
                      parent.value = angleManager.fromDisplayUnit(val, parent.storeAsRadians);
                  }
              }
          }
          
          Text {
              anchors.left: inputField.right
              anchors.verticalCenter: inputField.verticalCenter
              text: angleManager.useDegrees ? "°" : "rad"
          }
      }
      

      實現說明:

      1. 統一管理中心:通過AngleManager單例管理全局顯示狀態
      2. 雙向轉換
        • toDisplayUnit(): 將存儲值轉換為當前顯示單位
        • fromDisplayUnit(): 將顯示值轉換回存儲單位
      3. 數據存儲分離
        • 通過bool參數isStoredInRadians聲明數據存儲格式
        • 控件不需要關心當前顯示模式
      4. 自動響應
        • 當angleManager.useDegrees改變時,所有綁定toDisplayUnit的控件自動更新
      5. 支持雙向綁定
        • 編輯時自動轉換回原始存儲格式
      6. 組件化
        • 通過SmartAngleInput封裝可重用組件

      此方案特點:

      • 核心邏輯集中在C++中,性能更優
      • QML層保持簡潔
      • 支持任意類型控件(Slider、Text、Dial等)
      • 自動響應單位切換
      • 支持不同的數據存儲需求(有些數據存弧度,有些存角度)

      當用戶切換顯示模式時,所有控件會自動根據預設的存儲格式進行正確轉換,并在界面上更新顯示值和單位符號。

      posted @ 2025-06-17 15:50  今天昔水  閱讀(25)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产一区二区三区四区色| 少妇高潮毛片免费看| 国产超高清麻豆精品传媒麻豆精品 | 人人人澡人人肉久久精品| 成人网站免费观看永久视频下载| 欧美三级中文字幕在线观看| 国产精品中文第一字幕| 26uuu另类亚洲欧美日本| 久久综合国产精品一区二区| 无码国模国产在线观看免费| 国产精品有码在线观看| 人妻少妇精品视频无码综合| 国产一区二区在线有码| 日韩一区国产二区欧美三区| 国产一级二级三级毛片| 内射中出无码护士在线| 久久99精品中文字幕在| 鹿泉市| 中文字幕有码在线第十页| 国产成人人综合亚洲欧美丁香花| 久本草在线中文字幕亚洲| 国产福利微视频一区二区| 国产自产一区二区三区视频| 97久久超碰国产精品2021| 国产精品普通话国语对白露脸| 精品 无码 国产观看| japanese丰满奶水| 中文字幕国产精品资源| 日本精品极品视频在线| 亚洲欧美综合在线天堂| 祁门县| 亚洲第一区二区快射影院| 精品无码久久久久成人漫画| 双鸭山市| 超碰伊人久久大香线蕉综合| 国产午夜精品一区理论片| 航空| 永久无码天堂网小说区| 国产精品女在线观看| 欧美激情一区二区三区成人| 色成人精品免费视频|