2011-05-02 647 views
0

我在執行多個檢查操作時遇到問題。基本上我所做的是我將點擊標記幾個動作來調用markSeveral(),然後從那裏我打電話clicked()信號列表調用setcheckBoxes(),然後設置複選框。現在這個問題是第一次完全發生,但是當我第二次執行時,setcheckboxes()插槽被調用兩次,因此d複選框沒有被設置。再次爲第三次嘗試setcheckboxes()插槽被稱爲三次,但複選框確實設置。在qt中選擇多個複選框

爲什麼插槽只需撥打一次就撥打了很多次?

請告訴我我在做什麼錯了

在此先感謝。這是我的代碼段:

void Browser::markSeveral() 
{ 
    itemClicked=true; 
    multiSelect=true; 
    MarkClicked=true; 
    MarkMenuClicked=true; 

    connect(list,SIGNAL(clicked(QModelIndex)),this,SLOT(setCheckBoxes(QModelIndex))); 
} 

void Browser::setCheckBoxes(QModelIndex index) 
{ 

    if(MarkClicked ==true && model->data(index,Qt::CheckStateRole) == Qt::Unchecked) 
    {   
     model->setData(index,Qt::Checked,Qt::CheckStateRole); 
     indexList.append(index); 
    } 
    else 
    { 
     if(MarkClicked ==true && model->data(index,Qt::CheckStateRole) == Qt::Checked) 
     { 
      model->setData(index,Qt::Unchecked,Qt::CheckStateRole); 
      indexList.removeOne(index); 
     } 
    } 


} 

回答

3

如果你連接一個信號到一個時隙n次,發送信號一次將調用n次的時隙。如果多次調用markSeveral(),則會有多個連接。

您應該只進行一次connect()調用,通常在瀏覽器的ctor中。 或者保證只有一個連接,通過使用Qt :: UniqueConnection:

connect(list,SIGNAL(clicked(QModelIndex)),this,SLOT(setCheckBoxes(QModelIndex)), Qt::UniqueConnection); 

這將確保這正是一個連接在那裏。 前一個選項(在設置小部件時調用connect()一次)是首選。

+0

謝謝你這麼多..這解決了我的問題 – prakashpun 2011-05-02 10:44:51

+0

或通過'Qt :: UniqueConnection'作爲第五個參數連接()' – 2011-05-02 19:28:09

+0

mmutz:是的,忘了相對較新的(好吧,不是新的.. 。) 選項。 – 2011-05-02 19:46:13

相關問題