2015-05-31 2 views
1

Я немного stucked с созданием раскрывающегося списка, основываясь на QAction помещается в QToolBar
У меня есть файл XML с следующими данными:Выпадающее кнопку в QToolBar с изменяющимися полями

<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> 

NB : Я не знаю, сколько полевых групп будет, так же как и я не знаю, сколько будет кнопок.

Итак, прежде всего, я анализирую следующий XML-файл и извлекаю необходимые данные.

Для каждого button Я создаю свой собственный QAction и добавьте его в существующую панель инструментов.
Позже я создаю QMenu для каждой кнопки и заполняю ее QAction s для каждой группы и поля. У меня есть QAction для First fields, field1, field2 и т.д ...
Тогда для каждого button я использую setMenu метод и добавлять создаваемое меню там.
Если я запускаю свое приложение, я вижу свои кнопки на панели инструментов с раскрывающимися меню, и они выглядят так, как я ожидал.

Проблема в том, что мне нужно добавить некоторые функции к этим кнопкам.

Я бы хотел, чтобы пользователь мог их проверить (я использую setCheckable для всех QActions) и снимите флажок. Когда пользователь проверяет действия с именем группы, все поля, относящиеся к этой группе, становятся проверенными и так далее.

Как я не знаю, сколько кнопок и полей у меня будет при запуске, становится трудно работать с сигналами и слотами.
Это заставляет меня использовать QMap для хранения всех адресов созданных QAction, когда сигналы из этих полей испускаются, а затем используют метод find для поиска действий, которые его выбрали, и только они выполняют необходимое действие.

Вопрос в следующем: есть ли лучший способ достичь моей цели, или я должен продолжать использовать этот подход?

ответ

2

Если вы не знаете, сколько предметов будет создано, я советую вам использовать QSignalMapper (документация here).

Сначала вы ссылаетесь на каждый элемент с переменной в QSignalMapper, затем вы подключаете сигнал, который хотите (исходящий от вашего элемента), к преобразователю сигналов. Наконец, вы подключаете QSignalMapper к одному слоту, который получит контрольную переменную. Несколько сигнальных преобразователей можно использовать, если вам нужно подключать различные виды сигналов.

Вам все равно придется хранить каждый предмет где-то, но я думаю, что это путь.

+0

Звук хороший. На самом деле, я сделал то же самое, но вместо этого использовал QMap. – tema

 Смежные вопросы

  • Нет связанных вопросов^_^