#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
, поэтому я не могу управлять несколькими виджетами с помощью цикла.
Итак, мой вопрос
- Виджеты Qt имеют идентификаторы, которые могут быть назначены последовательно, такие как идентификаторы ресурсов MFC?
- Как я могу управлять несколькими виджетами?
- Я могу управлять несколькими виджетами, используя массив 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″…затем вы можете легко получить доступ к кнопкам в цикле.