gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:11:03 25 4
gpt4 key购买 nike

我正在创建一个 GUI 来操纵机器人 ARM 。 ARM 的位置可以用6个 float 来描述(描述 ARM 各个关节的位置。

该界面由带有 ARM 图的 QGraphicsView 组成(可以单击以更改 ARM 位置 - 调整 6 个 float )。该界面还有 6 个 lineEdit 框,也可以单独调整这些值。

当单击图形 View 时,当行编辑框发生变化时,我希望行编辑框/图形 View 保持同步。

这让我对如何存储 6 个 float 以及在它们更新时触发事件感到困惑。我目前的想法是这样的:

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

接下来是我比较困惑的一点,如何将所有内容连接起来。我在想:

  • MainWindow 有一个 ArmLocationChanged 插槽。每当位置对象更改时都会发出信号。

  • 图表类将有一个 SetRobotArmLocation(RobotArmLocation &loc)。当图表发生变化时,可以自由更改位置对象,并向 ArmLocationChanged 插槽发出信号。

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

这对我来说似乎是一团糟,有人有任何其他建议吗?我还想到了以下,有什么好处吗?

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

感谢任何智慧!

最佳答案

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

具体使用您的示例:

  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 中的值发生变化时调用。有一些更优雅的方法可以做到这一点,但为了简单起见,假设您定义了 6 个名为 setValue1(float)setValue2(float) 等的插槽。
  5. RobotMainWindow源代码中,声明并定义这些插槽,以便它们更新您的 ARM 、肩膀等。
  6. 同样在源代码中,定义一个信号valueChanged()(或为每个字段定义多个信号,由您选择)。让您定义的插槽 emit valueChanged()
  7. 回到 Qt Designer,您现在可以将来自每个 QLineEdit 的适当信号链接到 RobotMainWindow 中的相应插槽。
  8. 返回信号/槽编辑器,将valueChanged() 信号添加到RobotMainWindow(这样Qt Designer 就知道了)。使用上述过程将此信号连接到 RobotView 中的新插槽,以便它可以更新渲染。
  9. 重复所有这些以处理从 RobotView 到编辑字段的更改(通过 RobotMainWindow

简而言之,我认为如果通过 Form 子类(我认为是 MVC 中的 Controller)路由信号,您会发现一切都更加直接说法)。

关于c++ - Qt/C++ - 对调用者/被调用者、对象所有权感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2642199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com