2017-02-09 75 views
2

我需要连接一些复选框,所以当我点击一个时,它会被检查,而其他复选框会被取消选中。我的代码现在看起来像这样。复选框更改其他复选框语句

Connect在类的构造函数:

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())); 

和插槽

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); 

} 

代码不能按预期工作。当我第一次点击任何ChBx时,一切正常,但是当我下次点击其他时,它只会取消选中之前的内容,而对本身不做任何处理。只有在第二次点击它变得chekced。

另外我还发现一个bug,当我检查ChBox,然后通过单击它来取消选中它时,我可以检查2个ChBxes。 [图2]

Form Two ChBx checked

+4

为什么不使用[单选按钮](http://doc.qt.io/qt- 5/qradiobutton.html)是哪种设计用途? – Garf365

+0

我没有尝试使用单选按钮,但这是个好主意,谢谢。 –

回答

1

单选按钮是一个好主意。

但是,如果您确实想要使用复选框,则可以明确设置cb_thickness1已在cb_thickness1_isChecked()中选中,并对其他两个复选框执行相同操作。

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

我建议得到从QCheckBox类(可以称之为CustomCheckBox),增加信号私人插槽公共插槽

信号:

void enabled(); 

专用插槽:

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

公共插槽:

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

在构造函数中添加:

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

这样,您就可以使用简单的所连接。

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

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

随时改进此答案。 :)

0

确认在插槽中检查了按钮的状态,然后取消激活其他复选框,就像您已经做过的那样。您可以通过将其传递给插槽来使用stateChanged方法的参数。

这里是代码的工作: 变我:

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); 
} 
} 

变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); 
} 
} 
相关问题