2013-08-21 95 views
0

嗨,第一次在這裏發佈。我搜索並發現瞭如何重新實現QSpinBox類允許自定義使用。但是我不知道我的需求是否與重新實現驗證方法所發現的一樣多。如何爲QSpinBox自定義範圍

我需要一個自定義範圍,在值範圍內排除零值。微調器用於選擇加載圖像的縮放比率。設計時的初始範圍是-25到10.該範圍可能會根據圖像的尺寸而改變。儘管如此,我必須能夠爲所需的縮放因子「跳過」零。例如,範圍必須始終從-1到1,反之亦然。

在此先感謝。

+0

似乎跳過一些值的唯一方法是重新實現'stepBy'函數。 – fasked

+0

似乎我可以直接調用stepBy,而不是通過重新實現。我將使用它,並附帶@headsvk提供的建議 –

+0

我的意思是「唯一正確的方式」:)''QAbstractSpinBox'提供'stepBy'虛擬函數,就像您擁有的目標一樣。 – fasked

回答

1

我假設你正在收聽的是QSpinbox::valueChanged(int i)信號,那裏你可以做這樣的事情:

void zoomImage(int i) { 
    if (i == 0) { 
     if (lastValue < 0)  //if sliding from negative values 
     spinBox->setValue(1); 
     else 
     spinBox->setValue(-1); 

     return;     //skip processing for 0 
    } 
    else 
     lastValue = i;   //save last state to a class variable 

    //processing... 
} 

編輯:int lastValue用於存儲滑塊的位置是爲了確定是否命中0之前用戶滑動到負或正值

+0

感謝您的建議。你發佈了一個插槽的例子嗎?它具有與信號valueChanged(int i)相同的名稱和簽名。我正在使用該信號並從中調用一個槽(zoomImage(int))。這可能比重新實現QSpinBox方法更好(或者更簡單)。需要捕獲/緩存lastValue的手段 –

+0

是的當然,這是一個插槽..您需要知道某種方式,用戶移動滑塊以便跳過0到-1或1的方向,所以我用lastValue來記住最後一個滑塊的位置可以達到0 – headsvk

+0

有一個解決方案,我認爲但不能發佈一段時間,因爲我的地位在SO種姓系統。 –

0

什麼似乎已經奏效:

void MainWindow::zoomImage(int ctlValue) 
{ 
    if(ctlValue == 0) 
    { 
    if(zoomLastValue < 0) 
     ui->sbScaleImage->stepBy(1); 
    else 
     ui->sbScaleImage->stepBy(-1); 
    } 

    zoomLastValue = ui->sbScaleImage->value(); 
} 

道歉,如果我搞砸了格式。