Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: TaleFrance от Март 12, 2021, 11:48



Название: Динамическое заполнение формы на основе значений, введенных пользователем.
Отправлено: TaleFrance от Март 12, 2021, 11:48
Здравствуйте, необходим совет. Как сделать так, чтобы при включении/выключении  одной  из  «Галочек» (QCheckBox),  изменении значения одного из полей,  изменении текста одного из полей ввода и тд,  соответствующим  образом менялось значения у всех остальных? С помощью чего это реализуется? С какими инструментами обычно работают?


Название: Re: Динамическое заполнение формы на основе значений, введенных пользователем.
Отправлено: kambala от Март 12, 2021, 15:00
сигналы-слоты


Название: Re: Динамическое заполнение формы на основе значений, введенных пользователем.
Отправлено: TaleFrance от Март 16, 2021, 16:56
Код:
void MainWindow::on_pushButton_clicked()
{
    for(int i = 0; i < 3; i++)
   {
 
        box = new QCheckBox(this);
        ui ->verticalLayout->addWidget(box);      // Добавление
         box->setChecked(true);                // Устанавливаем галочку по умолчанию
 
          connect(box, SIGNAL(clicked()), this, SLOT(on_pushButton2_clicked()));
          connect(box, SIGNAL(clicked()), this, SLOT(on_pushButton3_clicked()));
    }
}
 
void MainWindow::on_pushButton2_clicked()
{
   for(int i = 0; i < 3; i++)
  {
       ui->verticalLayout->removeWidget(box);
   }
}
 
 
void MainWindow::on_pushButton3_clicked()
{
    for(int i = 0; i < 3; i++)
   {
        box = new QCheckBox(this);
        ui ->verticalLayout->addWidget(box);      // Добавление
         box->setChecked(false);                // Устанавливаем галочку по умолчанию
 
    }
 
}

Т.е нужно как-то связать один QCheckBox со всеми остальными или лучше удалить все QCheckBox и заново заполнять окно новыми боксами без галочки/ с галочкой ?


(http://)



Название: Re: Динамическое заполнение формы на основе значений, введенных пользователем.
Отправлено: kambala от Март 16, 2021, 18:03
а какого поведения ты пытаешься добиться?


Название: Re: Динамическое заполнение формы на основе значений, введенных пользователем.
Отправлено: TaleFrance от Март 16, 2021, 18:10
Нужно, чтобы при нажатии на любой из CheckBox-ов(создаются динамически) галочка убиралась не только у того CheckBox, на который нажал, но и у всех остальных. Т.е, при нажатии на ячейку с галочкой, галочка пропадает у всех ячеек одновременно. Надеюсь, правильно сформулировал.


Название: Re: Динамическое заполнение формы на основе значений, введенных пользователем.
Отправлено: kambala от Март 16, 2021, 19:54
тогда нужен сигнал clicked(bool) — в его обработчике при параметре false просто проходишься по списку своих чекбоксов и снимаешь с них галочку через setChecked(false). при желании также можно игнорировать тот, на который нажали — его возвращает метод sender().


Название: Re: Динамическое заполнение формы на основе значений, введенных пользователем.
Отправлено: TaleFrance от Март 16, 2021, 21:00
Код:
void MainWindow::on_pushButton_clicked()
{
   
    for(int i =0 ; i < 3; i++)
    {
       box1 = new QCheckBox;
       ui ->verticalLayout->addWidget(box1);
       box1 ->setChecked(true);
       connect(box1,  SIGNAL(clicked()), this, SLOT(on_pushButton2_clicked()));
    }
}


void MainWindow::on_pushButton2_clicked()
{

    for(QCheckBox*box : findChildren<QCheckBox*>())
    {
           box->setChecked(false);
           connect(box,  SIGNAL(clicked()), this, SLOT(on_pushButton3_clicked()));

    }

}

void MainWindow::on_pushButton3_clicked()
{
    for(QCheckBox*box : findChildren<QCheckBox*>())
    {
           box->setChecked(true);
           connect(box,  SIGNAL(clicked()), this, SLOT(on_pushButton2_clicked()));

    }

}

Спасибо, работает!  Дай Бог тебе здоровья.


Название: Re: Динамическое заполнение формы на основе значений, введенных пользователем.
Отправлено: juvf от Апрель 05, 2021, 14:23
при нажатии на ячейку с галочкой, галочка пропадает у всех ячеек одновременно.
чото у вас много ненужного кода... какие-то дополнительные велосипедные свои слоты.... в Qt уже всё есть
Цитировать
С какими инструментами обычно работают?
свяжите слоты и сигналы всех боксов др.на друга

connect(box,  SIGNAL(clicked(bool)), anotherBox, SLOT(setChecked(bool)));


например так
Код:
#include "mainwindow.h"

#include <QCheckBox>
#include <QHBoxLayout>
#define COUNT_BOX 3 //5, 10, .... 300
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
QWidget *w = new QWidget;
setCentralWidget(w);

QHBoxLayout *l = new QHBoxLayout;
w->setLayout(l);

QCheckBox *listBox[COUNT_BOX]
for(QCheckBox*box : listBox )
l->addWidget(box = new QCheckBox);

for(QCheckBox*box : findChildren<QCheckBox*>()) //или for(QCheckBox *box : listBox )
{
for(QCheckBox*box1 : findChildren<QCheckBox*>()) //или for(QCheckBox *box1 : listBox )
{
if(box != box1)
connect(box,  SIGNAL(clicked(bool)), box1, SLOT(setChecked(bool)));
}
}
}