Russian Qt Forum

Qt => Вопросы новичков => Тема начата: burenkov от Июль 10, 2016, 10:51



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


Название: Re: Несколько одинаковых по наполнению QGroupBox в форме
Отправлено: Bepec от Июль 10, 2016, 12:06
Пара вариантов.
1) сделать свой виджет, в виде групбокса с сигналами об изменении и прочим. Тогда вам нужно будет менять только 1 виджет и один обработчик на основной форме.
2) создавать всё динамически. Тогда вам нужно будет править код конструктора и опять таки обработчик на основной форме.
3) создать скриптовый движок, в котором данный виджет будет описываться пользовательским скриптом. Тогда вам нужно будет только править реакцию движка.


Название: Re: Несколько одинаковых по наполнению QGroupBox в форме
Отправлено: Igors от Июль 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 не получится. Ну там контролов немного, можно и руками


Название: Re: Несколько одинаковых по наполнению QGroupBox в форме
Отправлено: Old от Июль 10, 2016, 13:46
Вот правда в дызайнере нарисовать этот MyGroupBox не получится. Ну там контролов немного, можно и руками
Почему не получится - очень даже получится.


Название: Re: Несколько одинаковых по наполнению QGroupBox в форме
Отправлено: Bepec от Июль 10, 2016, 15:18
Мало того, спокойно рисуется, 1 раз компилируется, а потом просто берётся файл ui_названиеформы.cpp и выдирается оттуда конструктор. И всё в порядке :)


Название: Re: Несколько одинаковых по наполнению QGroupBox в форме
Отправлено: Old от Июль 10, 2016, 15:38
Мало того, спокойно рисуется, 1 раз компилируется, а потом просто берётся файл ui_названиеформы.cpp и выдирается оттуда конструктор. И всё в порядке :)
Для чего что-то выдирать? А если позже понадобиться его изменить, опять повторять этот изврат? Чем ui не угодил?


Название: Re: Несколько одинаковых по наполнению QGroupBox в форме
Отправлено: burenkov от Июль 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, так сказать, разобраться)


Название: Re: Несколько одинаковых по наполнению QGroupBox в форме
Отправлено: Bepec от Июль 10, 2016, 18:26
Это 2 разных подхода.
C ui и без ui :)
В случае c ui мы получаем удобство редактирования.
В случае без ui мы получаем "всё в одном файле", без зависимостей.


Название: Re: Несколько одинаковых по наполнению QGroupBox в форме
Отправлено: Old от Июль 10, 2016, 19:10
В случае без ui мы получаем "всё в одном файле", без зависимостей.
А мы и с ui получаем "все в одной коробке", только из 3 файлов, вместо 2.


Название: Re: Несколько одинаковых по наполнению QGroupBox в форме
Отправлено: burenkov от Июль 10, 2016, 19:52
Это 2 разных подхода.
C ui и без ui :)
В случае c ui мы получаем удобство редактирования.
В случае без ui мы получаем "всё в одном файле", без зависимостей.
Я правильно понимаю что можно сделать кастомный виджет, используя дизайнер, а потом этот виджет так же в дизайнере использовать в моем приложении?


Название: Re: Несколько одинаковых по наполнению QGroupBox в форме
Отправлено: Bepec от Июль 10, 2016, 20:06
Да, вам достаточно будет просто поместить пустой QWidget на окно и в контекстном меню выбрать "Преобразовать в ...". Там вбиваете имя своего класса и если cpp и h имеются в наличии, он будет преобразован.
Правда, отображения вроде не будет (хотя я давно этим не занимался), будет просто пустой прямоугольник, но вы сможете делать с ним всё, что хотите.

PS чтобы видеть заместо пустоты сам виджет, это уже надо будет собирать плагин к дизайнеру с вашим классом.
PPS причем креатору плагины дизайнера не подходят и наоборот :D


Название: Re: Несколько одинаковых по наполнению QGroupBox в форме
Отправлено: burenkov от Июль 10, 2016, 20:18
Да, вам достаточно будет просто поместить пустой QWidget на окно и в контекстном меню выбрать "Преобразовать в ...". Там вбиваете имя своего класса и если cpp и h имеются в наличии, он будет преобразован.
Правда, отображения вроде не будет (хотя я давно этим не занимался), будет просто пустой прямоугольник, но вы сможете делать с ним всё, что хотите.

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