1

QAction我有点坚持基于放置在QToolBar
我有一个包含以下数据的 XML 文件 中创建下拉按钮:

<cfg>
<fields>
  <group name="First fields">
    <field>filed1</field>
    <field>filed2</field>
    <field>filed3</field>
  </group>
  <group name="Second fields">
    <field>filed4</field>
    <field>filed5</field>
    <field>filed6</field>
      ... etc ...
  </group>
</fields>
<button name="MyButton1" />
<button name="MyButton2 />
      ... etc ...
</cfg>  

注意:我不知道会有多少字段组,也不知道会有多少按钮。

因此,首先,我解析以下 xml 文件并提取所需的数据。

对于每个button我创建自己的QAction并将其添加到现有工具栏。
稍后,我为每个按钮创建并为每个组和字段QMenu填充s。QAction我有QActionfor First fields, field1, field2, etc...
然后,对于每个button我使用的setMenu方法并在那里添加创建的菜单。
如果我启动我的应用程序,我可以在带有下拉菜单的工具栏中看到我的按钮,它们看起来就像我预期的那样。

这里的问题是我需要为这个按钮添加一些功能。

我想允许用户检查它们(我setCheckable全部使用QActions)并取消选中。当用户使用组名检查操作时,与该组相关的所有字段都会被选中,依此类推。

因为我不知道在启动时我会有多少按钮和字段,所以使用信号和插槽变得很困难。
它迫使我用来QMap存储 created 的所有地址QAction,当来自该字段的信号被发出时,然后使用 find 方法查找发出它的动作,并且只有它们执行所需的动作。

问题是:有没有更好的方法来实现我的目标,或者我应该继续使用这种方法?

4

1 回答 1

2

如果您不知道要创建多少项目,我建议您使用 QSignalMapper(此处的文档)。

首先,您使用 QSignalMapper 中的变量引用每个项目,然后将您想要的信号(来自您的项目)连接到信号映射器。最后,您将 QSignalMapper 连接到单个插槽,该插槽将接收引用变量。如果您需要连接不同类型的信号,可以使用多个信号映射器。

您当然仍然必须将每个项目存储在某个地方,但我认为这是要走的路。

于 2015-06-01T06:37:08.090 回答