我需要连接一些复选框,所以当我单击一个复选框时,它将变为选中状态,而其他复选框将变为未选中状态。我现在的代码是这样的。
在类构造函数中连接:
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时,一切都是正常的,但当我下次点击其他时,它只会取消选中上一次,并且不会对自己做任何事情。只有在第二次点击时,它才会被选中。
此外,我还发现了另一个错误,当我检查ChBox,然后通过单击它取消选择它,我可以检查2 ChBxes。图2


发布于 2017-02-09 17:09:39
单选按钮是个好主意。
但是如果你真的想使用复选框,你可以在cb_thickness1_isChecked()中显式地设置cb_thickness1 checked,并对其他两个复选框执行相同的操作。
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);
}发布于 2017-02-09 21:17:13
我建议从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()));请随时改进这个答案。:)
发布于 2017-02-09 22:57:02
确认该按钮的状态在插槽中处于选中状态,然后像您已经做的那样取消激活其他复选框。您可以通过将stateChanged方法的参数传递给插槽来使用该参数。
以下是可以工作的代码:变体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);
}
}变体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);
}
}https://stackoverflow.com/questions/42131687
复制相似问题