QT创建者:用代码触发插槽?

QT创建者:用代码触发插槽?,qt,combobox,action,slots,Qt,Combobox,Action,Slots,我可能把自己逼到了一个角落,但当时我觉得这是个好主意 我一直在开发一个界面,允许用户修改机器人设备的设置,即速度、方向、力等,以组合框的形式提供大量选项。问题是,在子类别中,这些东西大约有一千种。e、 g.速度类别x1、x2、x3、Y1、y2等。因此,与其在QT中创建一千个组合框,不如创建一组50(ish),然后提供几个按钮在类别之间切换。因此,当用户选择speed QT时,用适当的选项填充组合框,设置标签的样式表和文本等。因此,它看起来好像存在一个专用页面。然后,如果用户选择方向,QT将每个框

我可能把自己逼到了一个角落,但当时我觉得这是个好主意

我一直在开发一个界面,允许用户修改机器人设备的设置,即速度、方向、力等,以组合框的形式提供大量选项。问题是,在子类别中,这些东西大约有一千种。e、 g.速度类别x1、x2、x3、Y1、y2等。因此,与其在QT中创建一千个组合框,不如创建一组50(ish),然后提供几个按钮在类别之间切换。因此,当用户选择speed QT时,用适当的选项填充组合框,设置标签的样式表和文本等。因此,它看起来好像存在一个专用页面。然后,如果用户选择方向,QT将每个框的当前索引写入专用数组,然后用适当的内容重新填充框、标签等。然后,为了满足系统的各种需求,我一遍又一遍地这样做

所有这些似乎都很好。然而,我现在处于一个困境中,为导航到每个页面提供的选项已经增加。例如,我有向前/向后按钮(就像您在设置向导中所期望的那样),以及顶部的操作菜单,可以跳转到页面。所以现在代码变得非常重复。如果选择“下一步”按钮,我将当前值写入数组,然后重新填充。如果您从任意位置跳转到页面,我会查看我所在的位置,将其写入数组并填充框。因此,如果我需要更改任何内容,我必须在代码中的许多地方进行更改

我知道这不是最优的。我想做的是运行一个连续循环,就像我通常在C语言中对Micros所做的那样。这样程序可以在每次循环中查看一个变量,如果它是,那么它就会执行。然而,我并没有足够的技能在QT中解决这个循环。所以我的新想法是


是否可以使用变量触发操作或插槽。例如,如果用户按下“下一步”按钮,它会为不存在的按钮触发一个插槽,以便QT将执行特定的代码行?然后,我可以有一个专门的部分,专注于阅读和写作框,以及一系列的行动,将我带到那里

您可以在代码中发出一个由
emit
调用触发的信号,因此您可以将单击的下一个按钮信号连接到一个执行某些操作并继续移动的插槽,或者直接调用您创建的另一个触发其他插槽的信号,或者在按下按钮触发的lambda中执行一些操作。

我首先将所有组合框选项加载到一个QStringList数组(或者可能是一个
QList
列表的数组,以节省内存和代码效率)

然后,我将为当前组合框索引保留一个1000个整数的数组

当用户更改某个组合框中的值时,currentIndexChanged信号将触发相应的插槽(所有组合框的单个插槽就足够了-
sender()->objectName()
,以获取发送信号的组合框的名称):


按下“下一步/后退”按钮,重新填充组合框。另外,提供一些保存组合框索引的“保存”按钮(或在某些操作上触发保存槽,即在窗口关闭时,即使在计时器信号下也会触发保存槽)。

不清楚为什么FWD/BCK按钮必须为组合使用与直接导航不同的代码。在这两种情况下都是“保存当前屏幕,填充新屏幕”……:)我非常感谢您的反馈。你可能是对的,我只是一个天真的机械师。工程师正在努力解决这个问题。不过我会调查一下。谢谢我喜欢,谢谢我对这个不太熟悉,但我会玩的。向你问好,例如<代码>发出qaction->trigger()
void WindowWidget::on_ComboBox_currentIndexChanged(int index) 
{ 
    name = sender()->objectName();
    /* here change the corresponding integer in the current
       indexes array */
}