qradiobutton问题

问题描述:

我对单选按钮有问题。qradiobutton问题

我已经创建了一个带有两个单选按钮的组框,并将其设置为独占,因此当选中其中一个时,其他选项未选中。

当我检查一个它连接到一个插槽作为一个功能,所以它做了一个动作,更具体地说是改变比例和变换滑块的值。

问题是当我误点击已经检查过的按钮时,因为即使它已经检查它仍然连接到该函数并且滑块的值再次改变,这是我不想要的。

这里是从他们的代码:

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

有没有办法阻止它时,它已经被前检查?

我会在这里发布毫米()和像素()函数:

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

除了使用pressed()信号的你可以尝试使用toggled(bool)信号。该信号仅在按钮改变状态时才发出。看看: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; 

意义,如果单选按钮刚刚被选中,什么也不做,只是去了。

+0

但是当我检查一个时,另一个得不到检查。那会发出的信号呢? – SamuelNLP

+0

我已经使用mm()和pixel()函数更新了我的帖子,所以您可以看到使用切换的()信号更改了滑块的值。 – SamuelNLP

+0

是的,如果两个按钮都连接到“切换”,那么他们会。但请参阅我的答案中的编辑。 – rpsml

我认为最好的办法是存储选择哪个选项框相关的一个int值。每次点击一个选项框时,检查它是否已经通过使用变量选择,然后决定。

问候,

+0

我试图这样做,但它然后改变我的价值。例如,如果它是以毫米为单位并且值是5,如果我单击毫米,它应该什么都不做,但值会更改。 – SamuelNLP

+0

是否这样? bool check1 = ui-> radioButton-> isChecked(); bool check2 = ui-> radioButton_2-> isChecked();如果(check1 == FALSE){connect(ui-> radioButton,SIGNAL(clicked()),this,SLOT(mm())); } if(check2 == FALSE){connect(ui-> radioButton_2,SIGNAL(clicked()),this,SLOT(pixel())); }?它仍然不起作用。 – SamuelNLP