2014-09-04 3 views
3
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 "; 
} 

.... 

QT 작성자 사용 체크 된 확인란의 수를 확인하고 그에 따라 출력 문자열을 변경하려면 어떻게해야합니까? 여러 개의 if 문을 사용하면 NOT AND OR과 혼동을 느끼기 때문에 작동하지 않습니다. 및 모든 가능성을 코딩하는 데 오랜 시간이 걸립니다.여러 확인란이 선택되어 있는지 확인하는 방법은 무엇입니까

+4

는 다음 루프를 그 위에 QVector 모든 체크 박스를 추가하고 계산? – stijn

답변

11

귀하의 모든 checkBoxesgroupBox

에 있어야하는 것은이 시도 :

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 
} 
+1

고마워, 많은 좋은 대답하지만 너는 꽤 짧고 분명하다 * 엄지 손가락 * –

+0

성능면에서 차이가 없지만 for 루프 대신 foreach (QCheckBox * pCheck, allButtons)를 사용한다. – drescherjm

+1

@ 12dollar'QObject :: findChildren'을 사용하기 전에 먼저 [이 답변] (http://stackoverflow.com/a/19215870/2257050)을 읽으십시오. 또한'QObject :: findChildren'은 가난한 디자인의 신호를 처리하는 추악한 방법을 찾았지 만 그것은 저일지도 모릅니다. – thuga

2

를 사용하여 다음이

// 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) + ", "; 
     } 
    } 
0

사용 QString 대신 std::string과 같은 체크 박스의 배열 :

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(", ") + " "; 

이것은보기에 불과하지만이를 구현하는 데는 여러 가지 방법이 있습니다. 체크 박스는 클래스 필드 인 QList에 보관할 수 있으므로 매번 checkboxes 어레이를 "빌드"할 필요가 없습니다. 출력 등을 구축 할 때 + 연산자 대신 QString::arg() 연산자를 사용하여 문자열을 구성 할 수도 있습니다.

내가 제안한 것은 간단한 예입니다.

1

TLDR : 컨테이너에 넣고 반복하여 문자열을 만듭니다.

코드 :

// 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(); 
관련 문제