2012-08-24 30 views
1

我對單選按鈕有問題。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))); 
} 

回答

5

除了使用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

2

我認爲最好的辦法是存儲選擇哪個選項框相關的一個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