How to check if multiple checkboxes are checked

std::string output; 

if ((checkbox1->isChecked() && checkbox2->isChecked()) && 
   (!checkbox3->isChecked() || !checkbox4->isChecked() || !checkbox5->isChecked() || !checkbox6->isChecked()))
{
  output = " Using Checkbox: 1, 2 ";
}

if ((checkbox1->isChecked() && checkbox2->isChecked() && checkbox3->isChecked()) && 
   (!checkbox4->isChecked() || !checkbox5->isChecked() || !checkbox6->isChecked()))
{
  output = " Using Checkbox: 1, 2, 3 ";
}

....

      

with the help of the QT creator, how can I check how many checkboxes were checked and change the output line accordingly? with a few statements it doesn't work because of me being confused with all these NOT AND OR. and it takes a long time to code all the possibilities.

+3


source to share


4 answers


All yours checkBoxes

should be ingroupBox

Try the following:



QList<QCheckBox *> allButtons = ui->groupBox->findChildren<QCheckBox *>();
qDebug() <<allButtons.size();
for(int i = 0; i < allButtons.size(); ++i)
{
    if(allButtons.at(i)->isChecked())
        qDebug() << "Use" << allButtons.at(i)->text()<< i;//or what you need
}

      

+11


source


Use an array of checkboxes like



// h-file
#include <vector>
class MyForm {
...
    std::vector< QCheckBox* > m_checkBoxes;
};
// cpp-file
MyForm::MyForm() {
...
    m_checkBoxes.push_back( checkbox1 );
    m_checkBoxes.push_back( checkbox2 );
    ... 
    m_checkBoxes.push_back( checkbox5 );
}
...
    output = " Using Checkbox:";
    for ( int i = 0, size = m_checkBoxes.size(); i < size; ++i ) {
        if ( m_checkBoxes[ i ]->isChecked() ) {
            output += std::to_string( i + 1 ) + ", ";
        }
    }

      

+2


source


TL; DR: put them in a container and build your string iterating over them.

code:

// line taken from @Chernobyl
QList<QCheckBox *> allButtons = ui->groupBox->findChildren<QCheckBox *>();

auto index = 1;
std::ostringstream outputBuffer;
outputBuffer << "Using Checkbox: ";
for(const auto checkBox: allButtons)
{
    if(checkBox->isChecked())
        outputBuffer << index << ", ";
    ++index;
}
auto output = outputBuffer.str();

      

+1


source


Use QString

instead of std::string

and then:

QCheckBox* checkboxes[6];
checkbox[0] = checkbox1;
checkbox[1] = checkbox2;
checkbox[2] = checkbox3;
checkbox[3] = checkbox4;
checkbox[4] = checkbox5;
checkbox[5] = checkbox6;

QStringList usedCheckboxes;
for (int i = 0; i < 6; i++)
{
    if (checkbox[i]->isChecked())
        usedCheckboxes << QString::number(i+1);
}

QString output = " Using Checkbox: " + usedCheckboxes.join(", ") + " ";

      

This is just an example, but there are many ways to do this. You can store your checkboxes in QList

a class field so you don't have to "build" the array checkboxes

every time. You can also use QString::arg()

instead of a +

string operator when plotting the output, etc. Etc.

I offer you just a quick example.

0


source







All Articles