Вопрос о радиобутонах

У меня проблема с радио-кнопкой.

Я создал групповую коробку с двумя переключателями и установил ее как эксклюзивную, поэтому, когда одна из них отмечена, другая не отмечена.

когда я выбираю один, он подключается к слоту, который как функция выполняет действие, более конкретно меняет масштаб и преобразует значение из ползунка.

проблема в том, что когда я по ошибке нажал на уже проверенную кнопку, потому что, даже если она уже проверена, она все равно подключается к функции, и значение ползунка снова изменяется, чего я не хочу.

вот код из них:

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

2 ответа

Решение

Вместо использования pressed() сигнал, который вы можете попытаться использовать toggled(bool) сигнал. Этот сигнал испускается, только если кнопка меняет состояние. Взгляните на: http://doc.qt.io/qt-4.8/qabstractbutton.html

РЕДАКТИРОВАТЬ: если обе кнопки подключены к toggled(bool), затем проверка одного снимает флажок другого, а также вызывает сигнал. Но обратите внимание, что сигнал имеет bool это дает новое состояние кнопки. Ваши слоты также должны иметь это bool параметр, т.е. в вашем случае вам нужно переписать ваши слоты как void planevolume::mm(bool on) а также void planevolume::pixel(bool on),

Сделав это, вы можете просто проверить значение параметра. Если это false это означает, что кнопка была проверена, а теперь только что не отмечена. Тогда первая строка обеих ваших функций может быть такой простой, как

if (!on) return;

Это означает, что, если переключатель только что был отключен, ничего не делайте, просто уходите.

Я думаю, что лучший вариант - это сохранить значение типа int, связанное с тем, какой флажок выбран. Каждый раз, когда вы нажимаете на опцию, проверьте, если она уже выбрана с помощью переменной, а затем решите.

С Уважением,

Другие вопросы по тегам