我在执行多项检查操作时遇到问题。基本上我做的是点击标记几个动作来调用markSeveral()然后从那里我调用list的clicked()信号来调用setcheckBoxes()然后设置复选框。现在问题是第一次完全qt发生,但是当我第二次这样做时,setcheckboxes()槽被调用两次,因此没有设置d复选框。再次进行第三次尝试时,setcheckboxes()槽被调用三次,但d复选框确实被设置。
为什么我只拨打一次电话时调用了这么多次?
请告诉我我做错了什么
提前致谢。这是我的代码片段:
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);
}
}
}
答案 0 :(得分:3)
如果将信号连接到插槽n次,则发出一次信号将调用插槽n次。如果多次调用markSeveral(),则会有多个连接。
你应该只进行一次connect()调用,通常是在浏览器的ctor中。 或者通过使用Qt :: UniqueConnection:
确保只有一个连接connect( list,SIGNAL(clicked(QModelIndex)),this,SLOT(setCheckBoxes(QModelIndex)), Qt::UniqueConnection );
这可确保只有一个连接。 以前的选项(在设置小部件时调用connect()一次)是首选。