我的单选按钮有问题。
我创建了一个带有两个单选按钮的分组框,并将其设置为独占,这样当选中其中一个时,另一个就会被取消选中。
当我选中一个时,它连接到一个插槽,作为一个函数,它可以执行一个操作,更具体地说,更改比例并从Slider转换值。
问题是当我错误地点击了已经选中的按钮时,因为即使它已经选中了,它仍然连接到函数,滑块的值再次更改,这是我不希望的。
这是他们的代码:
//Conect change from MM or PIXEL, making the change in the scale
connect(ui->radioButton, SIGNAL(pressed())), this, SLOT(mm()));
connect(ui->radioButton_2, SIGNAL(pressed()), this, SLOT(pixel()));
有没有一种方法可以在之前已经检查过的情况下阻止它?
我将在这里发布mm()和pixel()函数:
// Function to transform the slider scale from pixel to mm
void planevolume::mm()
{
// Set the sliders ranges and connections
// X Slider
double xvaluem=ui->Slider->value();
ui->Slider->setRange(xmin, xmax/(256.0/3.0), 1.0/(256.0/3.0));
ui->Slider->setValue(xvaluem/(256.0/3.0));
ui->Slider->setScale(xmin, (xmax+1.0)/(256.0/3.0), ((xmax+1.0)/16.0)/(256.0/3.0));
connect(ui->Slider, SIGNAL(valueChanged(double)), ui->lcdNumber, SLOT(display(double)));
// Y Slider
double yvaluem=ui->Slider_2->value();
ui->Slider_2->setRange(ymin, ymax/(512.0), 1.0/(512.0));
ui->Slider_2->setValue(yvaluem/(512.0));
ui->Slider_2->setScale(ymin, (ymax+1.0)/512.0, (((ymax+1.0)/16.0)/512.0));
connect(ui->Slider_2, SIGNAL(valueChanged(double)), ui->lcdNumber_2, SLOT(display(double)));
// Z Slider
double zvaluem=ui->Slider_3->value();
ui->Slider_3->setRange(zmin, zmax/(64.0/3.0), 1.0/(64.0/3.0));
ui->Slider_3->setValue(zvaluem/(64.0/3.0));
ui->Slider_3->setScale(zmin, (zmax+1.0)/(64.0/3.0),(((zmax+1.0)/16.0)/(64.0/3.0)));
connect(ui->Slider_3, SIGNAL(valueChanged(double)), ui->lcdNumber_3, SLOT(display(double)));
}
// Function to transform the slider scale from mm to pixel
void planevolume::pixel()
{
// Set the sliders ranges and connections
// X Slider
double xvaluep=ui->Slider->value();
ui->Slider->setRange(xmin, xmax, 1.0);
ui->Slider->setValue(xvaluep*(256.0/3.0));
ui->Slider->setScale(xmin, xmax+1.0, (xmax+1.0)/16.0);
connect(ui->Slider, SIGNAL(valueChanged(double)), ui->lcdNumber, SLOT(display(double)));
// Y Slider
double yvaluep=ui->Slider_2->value();
ui->Slider_2->setRange(ymin, ymax, 1.0);
ui->Slider_2->setValue(yvaluep*(512.0));
ui->Slider_2->setScale(ymin, ymax+1.0, (ymax+1.0)/16.0);
connect(ui->Slider_2, SIGNAL(valueChanged(double)), ui->lcdNumber_2, SLOT(display(double)));
// Z Slider
double zvaluep=ui->Slider_3->value();
ui->Slider_3->setRange(zmin, zmax, 1.0);
ui->Slider_3->setValue(zvaluep*(64.0/3.0));
ui->Slider_3->setScale(zmin, zmax+1.0, (zmax+1.0)/16.0);
connect(ui->Slider_3, SIGNAL(valueChanged(double)), ui->lcdNumber_3, SLOT(display(double)));
}
您可以尝试使用toggled(bool)
信号,而不是使用pressed()
信号。只有当按钮改变状态时才会发出此信号。看看:http://doc.qt.io/qt-4.8/qabstractbutton.html#toggled
编辑:如果两个按钮都连接到toggled(bool)
,则选中其中一个按钮将取消选中另一个按钮并触发信号。但请注意,该信号有一个bool
,它给出了按钮的新状态。您的插槽也必须具有此bool
参数,即,在您的情况下,您需要将插槽重写为void planevolume::mm(bool on)
和void planevolume::pixel(bool on)
。
完成此操作后,您可以简单地检查参数的值。如果是false
,则表示该按钮已被选中,现在刚刚被取消选中。然后,两个函数的第一行可以像一样简单
if (!on) return;
意思是,如果单选按钮刚刚被取消选中,不要做任何事情,走开。
我认为最好的选择是存储与所选选项框相关的int值。每次单击选项框时,请使用变量检查该选项框是否已被选中,然后做出决定。
问候,