我正在创建一个GUI来操纵机器人手臂。手臂的位置可用6个浮标描述(描述各种手臂关节的位置。
界面由QGraphicsView和手臂图组成(可以单击以更改手臂位置 - 调整6个花车)。界面还有6个lineEdit框,也可以单独调整这些值。
单击图形视图时,以及更改行编辑框时,我希望行编辑框/图形视图保持同步。
这让我对如何存储6个浮点数感到困惑,并在更新时触发事件。我目前的想法是:
接下来是我更困惑的一点,如何加入一切。我在想:
MainWindow有一个ArmLocationChanged插槽。只要位置对象发生更改,就会发出此信号。
图表类将具有SetRobotArmLocation(RobotArmLocation& loc)。更改图表后,可以自由更改位置对象,并向ArmLocationChanged插槽发出信号。
这种看起来像是一团糟,有没有人有任何其他建议?我还想到了以下几点,它有什么好处吗?
感谢任何智慧!
答案 0 :(得分:3)
除了非常简单的情况(例如显示滑块值的标签)之外,我的经验是远离Qt Designer中的组件间信号/插槽连接。相反,让组件触发感兴趣的信号连接到您正在子类化的顶级QWidget类中定义的标准(即QMainWidow
等等......让我们将其称为Form
类)。您也可以采用其他方式:如果Form
类中有自定义信号,则可以将其与Qt Designer连接到其中一个公共窗口小部件插槽。
具体使用您的示例:
QMainWindow
和QGraphicsView
。我们调用子类RobotMainWindow
和RobotView
。RobotMainWindow
包含QLineEdit
字段和RobotView
。在Qt Designer中指定RobotView
的方法是插入QWidget
并使用 Promote to ... 功能告诉Qt应该替换QWidget
在编译时使用您的自定义RobotView
。QLineEdit
字段命名edit1
,edit2
... edit6
。RobotMainWindow
中的QLineEdit
中的插槽,以便setValue1(float)
中的值发生变化。有一些更优雅的方法可以做到这一点,但为了简单起见,我们假设你定义了6个名为setValue2(float)
,RobotMainWindow
等的插槽。valueChanged()
的源代码中,请声明并定义这些广告位,以便他们更新您的手臂,肩膀等等。emit valueChanged()
(或每个字段的多个,您的选择)。拥有您定义的广告位QLineEdit
。RobotMainWindow
的相应信号链接到valueChanged()
中的相应广告位。RobotMainWindow
信号添加到RobotView
(因此Qt Designer知道它)。使用上述步骤将此信号连接到RobotView
中的新插槽,以便更新渲染。RobotMainWindow
到编辑字段的更改(通过Form
。简而言之,如果您通过{{1}}子类(我将其视为MVC中的 Controller )的信号路由,我认为您会发现更直接的一切。