Russian Qt Forum
Сентябрь 30, 2024, 14:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Несколько одинаковых по наполнению QGroupBox в форме  (Прочитано 4191 раз)
burenkov
Гость
« : Июль 10, 2016, 10:51 »

Делаю приложения для настройки некой железки, на ней 12 кнопок, каждую из которых можно конфигурировать произвольным образом, настройки для всех кнопок одни и те же. Настройки для каждой кнопки находятся внутри QGroupBox. Нарисовал в дизайнере UI файл, но хорошо бы сделать это по-человечески, описав один QGroupBox со всеми внутренностям, и потом просто реплицировать. Чтобы при добавлении нового параметра делать изменения только водном месте, и чтобы в обработчике можно понять из какого именно QGroupBox пришел сигнал. Как вообще такое обычно делается?)
Скрин окошка прикрепляю
« Последнее редактирование: Июль 10, 2016, 10:57 от burenkov » Записан
Bepec
Гость
« Ответ #1 : Июль 10, 2016, 12:06 »

Пара вариантов.
1) сделать свой виджет, в виде групбокса с сигналами об изменении и прочим. Тогда вам нужно будет менять только 1 виджет и один обработчик на основной форме.
2) создавать всё динамически. Тогда вам нужно будет править код конструктора и опять таки обработчик на основной форме.
3) создать скриптовый движок, в котором данный виджет будет описываться пользовательским скриптом. Тогда вам нужно будет только править реакцию движка.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Июль 10, 2016, 13:27 »

Делаете один класс виджет MyGroupBox и создаете его N раз. В виджет записываете напр индекс по которому можно его опознать - чему он соответствует в данных. Когда пришел сигнал от кнопки - извлекаете индекс, напр так
Код
C++ (Qt)
for (int i = 0; i < 10; ++i)
parentWin->layout()->addWidget(new MyGroupBox(parentWin, i));
...
void SomeSlot( void )
{
QWidget * w = dynamic_cast<QWidget *> (sender());
MyGroupBox * box = 0;
while (w) {
  box = dynamic_cast<MyGroupBox *> (w);
  if (box) break;
  w = w->parentWidget();
}
 if (!box) return;
 int index = box->mIndex;
 ...
}
 
Вот правда в дызайнере нарисовать этот MyGroupBox не получится. Ну там контролов немного, можно и руками
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Июль 10, 2016, 13:46 »

Вот правда в дызайнере нарисовать этот MyGroupBox не получится. Ну там контролов немного, можно и руками
Почему не получится - очень даже получится.
Записан
Bepec
Гость
« Ответ #4 : Июль 10, 2016, 15:18 »

Мало того, спокойно рисуется, 1 раз компилируется, а потом просто берётся файл ui_названиеформы.cpp и выдирается оттуда конструктор. И всё в порядке Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #5 : Июль 10, 2016, 15:38 »

Мало того, спокойно рисуется, 1 раз компилируется, а потом просто берётся файл ui_названиеформы.cpp и выдирается оттуда конструктор. И всё в порядке Улыбающийся
Для чего что-то выдирать? А если позже понадобиться его изменить, опять повторять этот изврат? Чем ui не угодил?
Записан
burenkov
Гость
« Ответ #6 : Июль 10, 2016, 16:35 »

Делаете один класс виджет MyGroupBox и создаете его N раз. В виджет записываете напр индекс по которому можно его опознать - чему он соответствует в данных. Когда пришел сигнал от кнопки - извлекаете индекс, напр так
Код
C++ (Qt)
for (int i = 0; i < 10; ++i)
parentWin->layout()->addWidget(new MyGroupBox(parentWin, i));
...
void SomeSlot( void )
{
QWidget * w = dynamic_cast<QWidget *> (sender());
MyGroupBox * box = 0;
while (w) {
  box = dynamic_cast<MyGroupBox *> (w);
  if (box) break;
  w = w->parentWidget();
}
 if (!box) return;
 int index = box->mIndex;
 ...
}
 
Вот правда в дызайнере нарисовать этот MyGroupBox не получится. Ну там контролов немного, можно и руками

Спасибо, буду пробовать! рисовать в дизайнере или ручками, пока не принципиально.. мне бы с общим flow, так сказать, разобраться)
Записан
Bepec
Гость
« Ответ #7 : Июль 10, 2016, 18:26 »

Это 2 разных подхода.
C ui и без ui Улыбающийся
В случае c ui мы получаем удобство редактирования.
В случае без ui мы получаем "всё в одном файле", без зависимостей.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #8 : Июль 10, 2016, 19:10 »

В случае без ui мы получаем "всё в одном файле", без зависимостей.
А мы и с ui получаем "все в одной коробке", только из 3 файлов, вместо 2.
Записан
burenkov
Гость
« Ответ #9 : Июль 10, 2016, 19:52 »

Это 2 разных подхода.
C ui и без ui Улыбающийся
В случае c ui мы получаем удобство редактирования.
В случае без ui мы получаем "всё в одном файле", без зависимостей.
Я правильно понимаю что можно сделать кастомный виджет, используя дизайнер, а потом этот виджет так же в дизайнере использовать в моем приложении?
Записан
Bepec
Гость
« Ответ #10 : Июль 10, 2016, 20:06 »

Да, вам достаточно будет просто поместить пустой QWidget на окно и в контекстном меню выбрать "Преобразовать в ...". Там вбиваете имя своего класса и если cpp и h имеются в наличии, он будет преобразован.
Правда, отображения вроде не будет (хотя я давно этим не занимался), будет просто пустой прямоугольник, но вы сможете делать с ним всё, что хотите.

PS чтобы видеть заместо пустоты сам виджет, это уже надо будет собирать плагин к дизайнеру с вашим классом.
PPS причем креатору плагины дизайнера не подходят и наоборот Веселый
Записан
burenkov
Гость
« Ответ #11 : Июль 10, 2016, 20:18 »

Да, вам достаточно будет просто поместить пустой QWidget на окно и в контекстном меню выбрать "Преобразовать в ...". Там вбиваете имя своего класса и если cpp и h имеются в наличии, он будет преобразован.
Правда, отображения вроде не будет (хотя я давно этим не занимался), будет просто пустой прямоугольник, но вы сможете делать с ним всё, что хотите.

PS чтобы видеть заместо пустоты сам виджет, это уже надо будет собирать плагин к дизайнеру с вашим классом.
PPS причем креатору плагины дизайнера не подходят и наоборот Веселый
Спасибо, попробую!
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.229 секунд. Запросов: 22.