Как я могу управлять несколькими виджетами в цикле в Qt?

#c #qt

#c #qt

Вопрос:

При создании элементов управления в MFC (либо динамически создаваемых, либо с использованием редактора ресурсов MFC) каждый элемент управления имеет уникальный идентификатор ресурса. Итак, я предопределил идентификаторы ресурсов управления в файле заголовка и использовал GetDlgItem(int) функцию в цикле for, когда мне требовалось несколько манипуляций с элементами управления.

Вот пример MFC:

 // ResourceID.h
#define IDC_BTN1 WM_USER   101
#define IDC_BTN2 WM_USER   102
#define IDC_BTN3 WM_USER   103
...
#define IDC_BTN10 WM_USER   110

// When getting the checked state of buttons 1 to 10
for(int i = IDC_BTN1; i <= IDC_BTN10; i  )
  ((CButton*)GetDlgItem(i))->GetCheck();
  

Теперь я хочу сделать то же самое в Qt (обработка нескольких виджетов в пакетном режиме). Я разместил 10 кнопок с помощью Qt Designer (не динамически созданного). Однако доступ к Qt возможен только с помощью объекта типа ui->pushButton , поэтому я не могу управлять несколькими виджетами с помощью цикла.

Итак, мой вопрос

  1. Виджеты Qt имеют идентификаторы, которые могут быть назначены последовательно, такие как идентификаторы ресурсов MFC?
  2. Как я могу управлять несколькими виджетами?
  3. Я могу управлять несколькими виджетами, используя массив QPushButton * следующим образом:
 // in header 
QPushButton *btnArr[10];

// in constructor
btnArr[0] = ui->btn1;
btnArr[1] = ui->btn2;
...

// control multiple widgets
for(QPushButton *btn : btnArr)
  btn->hide();
  

Это работает, но правильно ли это?

Комментарии:

1. В вашем конкретном случае вы также могли бы поместить несколько виджетов в родительский виджет, чтобы скрыть их сразу. Похоже, ваша проблема связана с использованием конструктора виджетов (чего я никогда не делаю). Следовательно, у вас нет полного контроля над исходным кодом (т. Е. над тем, как хранятся кнопки), который у вас был бы, если бы вы писали свой код вручную. Я полагаю, что у вас есть только два шанса: либо удалить конструктор виджетов, либо создать дополнительный массив для указателей кнопок, который инициализируется один раз (например, в конструкторе).

2. Другим вариантом может быть присвоение кнопкам определенных имен, чтобы вы могли найти их по имени позже. Хотя я бы предпочел решение, подобное вашему последнему фрагменту кода.

3. @Scheff Тогда, это не неправильный способ создать и использовать дополнительный массив указателей кнопок. Спасибо за комментарий. Дизайнеры, безусловно, являются одной из сильных сторон Qt для новичка Qt вроде меня, но иногда кажется, что дизайнер усложняет создание того, что я хочу.

Ответ №1:

Если ваши кнопки находятся в одном родительском. Вы можете использовать метод setObjectName, чтобы задать название для кнопок.

Затем из родительского элемента вы можете получить доступ к кнопкам через имя объекта, используя метод findChild. Если названия кнопок указаны в правиле типа «button1», «button2″…затем вы можете легко получить доступ к кнопкам в цикле.