2017-02-09 5 views
2

Ich muss einige Checkboxen verbinden, wenn ich also auf eins klicke, wird es überprüft und andere werden deaktiviert. Mein Code sieht jetzt so aus.Kontrollkästchen ändern andere Kontrollkästchen Anweisung

Connect in Klassenkonstruktors:

connect(cb_thickness1,SIGNAL(stateChanged(int)),this,SLOT(cb_thickness1_isChecked())); 
connect(cb_thickness2,SIGNAL(stateChanged(int)),this,SLOT(cb_thickness2_isChecked())); 
connect(cb_thickness3,SIGNAL(stateChanged(int)),this,SLOT(cb_thickness3_isChecked())); 

und Schlitze

void MainWind::cb_thickness1_isChecked() 
{ 
    if(cb_thickness2->isChecked()) 
     cb_thickness2->setChecked(false); 
    if(cb_thickness3->isChecked()) 
     cb_thickness3->setChecked(false); 
} 
void MainWind::cb_thickness2_isChecked() 
{ 
    if(cb_thickness1->isChecked()) 
     cb_thickness1->setChecked(false); 
    if(cb_thickness3->isChecked()) 
     cb_thickness3->setChecked(false); 

} 
void MainWind::cb_thickness3_isChecked() 
{ 
    if(cb_thickness1->isChecked()) 
     cb_thickness1->setChecked(false); 
    if(cb_thickness2->isChecked()) 
     cb_thickness2->setChecked(false); 

} 

-Code funktioniert nicht wie erwartet. Wenn ich zum ersten Mal auf ein ChBx klicke, ist alles in Ordnung, aber wenn ich das nächste Mal klicke, wird nur das vorherige Häkchen entfernt und nichts mit sich selbst gemacht. Erst beim zweiten Klick wird es chekced.

Auch ich fand einen weiteren Fehler, wenn ich an ChBox überprüfe, und dann das Häkchen entfernt, indem ich darauf klicke, kann ich 2 ChBxes überprüfen. [Pic 2]

Form Two ChBx checked

+4

warum nicht mit [Radio-Button] (http://doc.qt.io/qt- 5/qradiobutton.html) welche sind design für art der verwendung? – Garf365

+0

Ich versuche nicht Radio Knopf zu benutzen, aber es ist eine gute Idee, danke. –

Antwort

1

Radioknopf ist eine großartige Idee.

Wenn Sie jedoch das Kontrollkästchen wirklich verwenden möchten, können Sie cb_thickness1, das in cb_thickness1_isChecked() aktiviert ist, explizit festlegen, und dasselbe für andere zwei Kontrolle-Kästchen tun.

void MainWind::cb_thickness1_isChecked() 
{ 
    cb_thickness1->setChecked(true); 
    cb_thickness2->setChecked(false); 
    cb_thickness3->setChecked(false); 
} 
void MainWind::cb_thickness2_isChecked() 
{ 
    cb_thickness1->setChecked(false); 
    cb_thickness2->setChecked(true); 
    cb_thickness3->setChecked(false); 
} 
void MainWind::cb_thickness3_isChecked() 
{ 
    cb_thickness1->setChecked(false); 
    cb_thickness2->setChecked(false); 
    cb_thickness3->setChecked(true); 
} 
0

Ich schlage vor, eine Klasse von QCheckBox abzuleiten (nennen wir es CustomCheckBox) und fügen Sie ein Signal, privaten Schlitz und öffentlichen Schlitz

Signal:

void enabled(); 

privater Steckplatz:

void CustomCheckBox::checkEnable(bool state) 
{ 
    if(state) 
    { 
     emit enabled(); 
    } 
} 

öffentlichen Schlitz:

void CustomCheckBox::uncheck() 
{ 
    setChecked(false); 
} 

im Konstruktor hinzu:

connect(this,SIGNAL(toggled(bool)),this,SLOT(checkEnable(bool))); 

diese Weise können Sie einfach Connects verwenden können.

CustomCheckBox *box1 = new CustomCheckBox(); 
CustomCheckBox *box2 = new CustomCheckBox(); 

connect(box1,SIGNAL(enabled()),box2,SLOT(uncheck())); 

Fühlen Sie sich frei, diese Antwort zu verbessern. :)

0

Überprüfen Sie, ob der Status der Schaltfläche im Slot aktiviert ist und deaktivieren Sie dann die anderen Kontrollkästchen, wie Sie es bereits getan haben. Sie können den Parameter der stateChanged-Methode verwenden, indem Sie ihn an die Slots übergeben.

Hier ist der Code, das funktioniert: Variante I:

connect(ui->checkBoxA, SIGNAL(stateChanged(int)), this, SLOT(checkBoxAChanged(int))); 
connect(ui->checkBoxB, SIGNAL(stateChanged(int)), this, SLOT(checkBoxBChanged(int))); 
connect(ui->checkBoxC, SIGNAL(stateChanged(int)), this, SLOT(checkBoxCChanged(int))); 

void MainWindow::checkBoxAChanged(int state) 
{ 
if (state == Qt::Checked) { 
    ui->checkBoxB->setChecked(false); 
    ui->checkBoxC->setChecked(false); 
} 
} 

void MainWindow::checkBoxBChanged(int state) 
{ 
if (state == Qt::Checked) { 
    ui->checkBoxA->setChecked(false); 
    ui->checkBoxC->setChecked(false); 
} 
} 

void MainWindow::checkBoxCChanged(int state) 
{ 
if (state == Qt::Checked) { 
    ui->checkBoxB->setChecked(false); 
    ui->checkBoxA->setChecked(false); 
} 
} 

Variante II:

connect(ui->checkBoxA, SIGNAL(clicked(bool)), this, SLOT(checkBoxAClicked(bool))); 
connect(ui->checkBoxB, SIGNAL(clicked(bool)), this, SLOT(checkBoxBClicked(bool))); 
connect(ui->checkBoxC, SIGNAL(clicked(bool)), this, SLOT(checkBoxCClicked(bool))); 

void MainWindow::checkBoxAClicked(bool val) 
{ 
if (val == true) { 
    ui->checkBoxB->setChecked(false); 
    ui->checkBoxC->setChecked(false); 
} 
} 

void MainWindow::checkBoxBClicked(bool val) 
{ 
if (val == true) { 
    ui->checkBoxA->setChecked(false); 
    ui->checkBoxC->setChecked(false); 
} 
} 

void MainWindow::checkBoxCClicked(bool val) 
{ 
if (val == true) { 
    ui->checkBoxB->setChecked(false); 
    ui->checkBoxA->setChecked(false); 
} 
} 
Verwandte Themen