Qt / C ++ - 对调用者/被调用者,对象所有权感到困惑

时间:2010-04-15 01:36:05

标签: c++ qt

我正在创建一个GUI来操纵机器人手臂。手臂的位置可用6个浮标描述(描述各种手臂关节的位置。

界面由QGraphicsView和手臂图组成(可以单击以更改手臂位置 - 调整6个花车)。界面还有6个lineEdit框,也可以单独调整这些值。

单击图形视图时,以及更改行编辑框时,我希望行编辑框/图形视图保持同步。

这让我对如何存储6个浮点数感到困惑,并在更新时触发事件。我目前的想法是:

  • 机器人手臂的位置应该由一个类RobotArmLocation表示。这个类的对象然后有obj.ShoulderRotation()和obj.SetShoulderRotation()等方法。
  • MainWindow有一个RobotArmLocation实例。

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

  • MainWindow有一个ArmLocationChanged插槽。只要位置对象发生更改,就会发出此信号。

  • 图表类将具有SetRobotArmLocation(RobotArmLocation& loc)。更改图表后,可以自由更改位置对象,并向ArmLocationChanged插槽发出信号。

  • 同样,更改任何文本框都会向该ArmLocationChanged插槽发出信号。然后,插槽具有同步所有元素的代码。

这种看起来像是一团糟,有没有人有任何其他建议?我还想到了以下几点,它有什么好处吗?

  • RobotArmLocation类有一个ValueChanged插槽,图表和文本框可以直接使用它,并直接绕过MainWindow(看起来更干净?)

感谢任何智慧!

1 个答案:

答案 0 :(得分:3)

除了非常简单的情况(例如显示滑块值的标签)之外,我的经验是远离Qt Designer中的组件间信号/插槽连接。相反,让组件触发感兴趣的信号连接到您正在子类化的顶级QWidget类中定义的标准(即QMainWidow等等......让我们将其称为Form类)。您也可以采用其他方式:如果Form类中有自定义信号,则可以将其与Qt Designer连接到其中一个公共窗口小部件插槽。

具体使用您的示例:

  1. 我将假设你已经分组了QMainWindowQGraphicsView。我们调用子类RobotMainWindowRobotView
  2. RobotMainWindow包含QLineEdit字段和RobotView。在Qt Designer中指定RobotView的方法是插入QWidget并使用 Promote to ... 功能告诉Qt应该替换QWidget在编译时使用您的自定义RobotView
  3. QLineEdit字段命名edit1edit2 ... edit6
  4. 在Qt Designer 信号/插槽编辑器中定义RobotMainWindow中的QLineEdit中的插槽,以便setValue1(float)中的值发生变化。有一些更优雅的方法可以做到这一点,但为了简单起见,我们假设你定义了6个名为setValue2(float)RobotMainWindow等的插槽。
  5. valueChanged()源代码中,请声明并定义这些广告位,以便他们更新您的手臂,肩膀等等。
  6. 同样在源代码中,定义一个信号emit valueChanged()(或每个字段的多个,您的选择)。拥有您定义的广告位QLineEdit
  7. 返回Qt Designer,您现在可以将每个RobotMainWindow的相应信号链接到valueChanged()中的相应广告位。
  8. 返回信号/插槽编辑器RobotMainWindow信号添加到RobotView(因此Qt Designer知道它)。使用上述步骤将此信号连接到RobotView中的新插槽,以便更新渲染。
  9. 重复所有这些操作,以处理从RobotMainWindow到编辑字段的更改(通过Form
  10. 简而言之,如果您通过{{1}}子类(我将其视为MVC中的 Controller )的信号路由,我认为您会发现更直接的一切。