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

есть ли способ заблокировать его, если он уже был проверен раньше?

Я размещу здесь функции 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)));
}

person SamuelNLP    schedule 24.08.2012    source источник


Ответы (2)


Вместо использования сигнала 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;

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

person rpsml    schedule 24.08.2012
comment
но когда я проверяю один, другой снимается. это тоже будет сигналом? - person SamuelNLP; 24.08.2012
comment
Я обновил свой пост функциями mm () и pixel (), чтобы вы могли видеть, что с помощью сигнала toggled () изменяется значение ползунка. - person SamuelNLP; 24.08.2012
comment
Да, если обе кнопки подключены к toggled, то они будут. Но см. Правку в моем ответе. - person rpsml; 24.08.2012

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

С уважением,

person Didac Perez Parera    schedule 24.08.2012
comment
Я пытался это сделать, но это изменило мою ценность. например, если это в миллиметровом масштабе и значение 5, если я щелкну в миллиметрах, ничего не произойдет, но значение изменится. - person SamuelNLP; 24.08.2012
comment
нравится? bool check1 = ui- ›radioButton-› isChecked (); bool check2 = ui- ›radioButton_2-› isChecked (); if (check1 == FALSE) {connect (ui- ›radioButton, SIGNAL (щелкнул ()), this, SLOT (mm ())); } if (check2 == FALSE) {connect (ui- ›radioButton_2, SIGNAL (clicked ()), this, SLOT (pixel ())); }? это все еще не работает. - person SamuelNLP; 24.08.2012