2011-05-02 159 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