3

ラジオボタンに問題があります。

2 つのラジオ ボタンを含むグループ ボックスを作成し、それを排他的に設定して、1 つをオンにするともう 1 つがオフになるようにしました。

1つをチェックすると、機能としてスロットに接続されるため、アクションを実行します。より具体的には、スケールを変更し、スライダーから値を変換します。

問題は、すでにチェックされているボタンを誤ってクリックしたときです。すでにチェックされていても、機能に接続され、スライダーの値が再び変更されるため、これは望ましくありません。

それらのコードは次のとおりです。

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

2 に答える 2

6

シグナルを使用する代わりに、pressed()シグナルを使用してみてくださいtoggled(bool)。このシグナルは、ボタンの状態が変化した場合にのみ発行されます。見てみましょう: http://doc.qt.io/qt-4.8/qabstractbutton.html#toggled

編集: 両方のボタンが に接続されている場合、toggled(bool)一方をオンにすると他方がオフになり、信号もトリガーされます。ただし、信号にはbool、ボタンの新しい状態を示す があることに注意してください。スロットにもこのboolパラメーターが必要です。つまり、あなたの場合、スロットをvoid planevolume::mm(bool on)andとして書き換える必要がありますvoid planevolume::pixel(bool on)

これが完了したら、パラメーターの値を簡単に確認できます。表示されている場合はfalse、ボタンがチェックされていて、現在チェックが外されていることを意味します。次に、両方の関数の最初の行を次のように単純にすることができます

if (!on) return;

つまり、ラジオ ボタンのチェックが外されたばかりの場合は、何もせずに立ち去るだけです。

于 2012-08-24T15:18:10.177 に答える
2

最適なオプションは、選択されているオプション ボックスに関連する int 値を格納することだと思います。オプション ボックスをクリックするたびに、変数を使用して既に選択されているかどうかを確認し、決定します。

よろしく、

于 2012-08-24T11:51:18.530 に答える