qradiobutton问题

Sam*_*NLP 2 qt qradiobutton

我有单选按钮的问题.

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

当我检查一个它连接到一个槽作为一个函数,所以它做一个动作,更具体地说,改变比例并从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()));
Run Code Online (Sandbox Code Playgroud)

有没有办法在之前已经检查过时阻止它?

我将在这里发布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)));
}
Run Code Online (Sandbox Code Playgroud)

rps*_*sml 6

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;
Run Code Online (Sandbox Code Playgroud)

意思是,如果单选按钮刚刚取消选中,则不要做任何事情,只需离开即可.