2010-04-15 74 views
1

我正在創建一個GUI來操縱機器人手臂。手臂的位置可以通過6個浮標來描述(描述各個手臂關節的位置)Qt/C++ - 關於調用者/被調用者,對象所有權的困惑

該界面由一個帶有手臂圖的QGraphicsView組成(可以通過點擊來改變手臂位置 - 調整這個界面還有6個lineEdit框,也可以分別調整這些值

當圖形視圖被點擊,當行編輯框被改變時,我想要行編輯框/圖形視圖以保持同步

這讓我很困惑如何存儲6個浮點數,並在更新時觸發事件。我目前的想法是這樣的:

  • 機器人手臂的位置應該由類RobotArmLocation表示。這個類的對象然後具有諸如obj.ShoulderRotation()和obj.SetShoulderRotation()的方法。
  • MainWindow具有RobotArmLocation的單個實例。

接下來是我更加困惑的一點,如何加入一切。我在想:

  • MainWindow有一個ArmLocationChanged插槽。每當位置對象發生變化時就會發出這個信號。

  • 圖類將有一個SetRobotArmLocation(RobotArmLocation & loc)。當圖改變時,可以自由更改位置對象,並向ArmLocationChanged插槽發出信號。

  • 同樣,更改任何文本框將觸發一個信號到該ArmLocationChanged插槽。插槽然後有代碼來同步所有元素。

這種看起來像是一團糟,有沒有人有任何其他的建議?我也想過以下幾點,它有沒有merrit?

  • 的RobotArmLocation類有一個插槽的ValueChanged,圖表和文本框可以直接使用,直接繞過主窗口(似乎更清潔?)

感謝您的智慧!

回答

3

除了非常簡單的情況(例如顯示滑塊值的標籤)之外,我的經驗是遠離Qt Designer內部的組件間信號/插槽連接。相反,讓組件觸發感興趣的信號連接到您要繼承的頂級QWidget類中定義的slog(即QMainWidow等等,我們只是將其稱爲Form類)。您也可以換個方式:如果您在Form類中有自定義信號,則可以將它與Qt Designer連接到其中一個公共插件插槽。

  1. 我會假設你已經子類QMainWindowQGraphicsView

    要使用你的例子是具體的。我們來調用子類RobotMainWindowRobotView

  2. RobotMainWindow包含QLineEdit字段和RobotView。在Qt Designer中指定RobotView的方式是插入QWidget並使用升級到...功能來告訴Qt QWidget應該在編譯時用您的定製RobotView替換。
  3. 命名爲QLineEdit字段edit1, edit2 ... edit6
  4. 在Qt設計器中信號/插槽編輯器定義在中的值發生更改時要調用的RobotMainWindow中的插槽。這樣做有一些更優雅的方式,但爲了簡單起見,假設您定義6個插槽命名setValue1(float)setValue2(float)
  5. 源代碼RobotMainWindow,去聲明和定義這些插槽,這樣它們更新手臂,肩膀,不管。
  6. 也在源代碼中,定義一個信號valueChanged()(或每個字段的倍數,您的選擇)。有你定義的插槽emit valueChanged()
  7. 回到Qt Designer中,您現在可以將來自每個QLineEdit的適當信號鏈接到RobotMainWindow中的對應插槽。
  8. 返回信號/插槽編輯器valueChanged()信號添加到RobotMainWindow(因此Qt Designer知道它)。使用上述步驟將此信號連接到RobotView中的新插槽,以便它可以更新渲染。
  9. 重複所有這一切都爲通過RobotMainWindow處理來自RobotView到編輯字段(變化。

總之,我認爲,如果你的路線,你會發現一切都更直接的通過你的Form子類的信號(我認爲這是MVC說法中的控制器