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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Динамическое заполнение формы на основе значений, введенных пользователем.  (Прочитано 8575 раз)
TaleFrance
Новичок

Offline Offline

Сообщений: 17


Просмотр профиля
« : Март 12, 2021, 11:48 »

Здравствуйте, необходим совет. Как сделать так, чтобы при включении/выключении  одной  из  «Галочек» (QCheckBox),  изменении значения одного из полей,  изменении текста одного из полей ввода и тд,  соответствующим  образом менялось значения у всех остальных? С помощью чего это реализуется? С какими инструментами обычно работают?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Март 12, 2021, 15:00 »

сигналы-слоты
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
TaleFrance
Новичок

Offline Offline

Сообщений: 17


Просмотр профиля
« Ответ #2 : Март 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 и заново заполнять окно новыми боксами без галочки/ с галочкой ?




Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Март 16, 2021, 18:03 »

а какого поведения ты пытаешься добиться?
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
TaleFrance
Новичок

Offline Offline

Сообщений: 17


Просмотр профиля
« Ответ #4 : Март 16, 2021, 18:10 »

Нужно, чтобы при нажатии на любой из CheckBox-ов(создаются динамически) галочка убиралась не только у того CheckBox, на который нажал, но и у всех остальных. Т.е, при нажатии на ячейку с галочкой, галочка пропадает у всех ячеек одновременно. Надеюсь, правильно сформулировал.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Март 16, 2021, 19:54 »

тогда нужен сигнал clicked(bool) — в его обработчике при параметре false просто проходишься по списку своих чекбоксов и снимаешь с них галочку через setChecked(false). при желании также можно игнорировать тот, на который нажали — его возвращает метод sender().
« Последнее редактирование: Март 16, 2021, 19:56 от kambala » Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
TaleFrance
Новичок

Offline Offline

Сообщений: 17


Просмотр профиля
« Ответ #6 : Март 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()));

    }

}

Спасибо, работает!  Дай Бог тебе здоровья.
Записан
juvf
Программист
*****
Offline Offline

Сообщений: 570


Просмотр профиля
« Ответ #7 : Апрель 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)));
}
}
}
« Последнее редактирование: Апрель 05, 2021, 14:30 от juvf » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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