最近在工作中遇到个bug,QAction使用了toggled信号,本意是定义一系列的action菜单,菜单中有,50%,75%,100%,200%,300%。发现在
void func1(){
connect(action, &QAction::toggled, [this, text] {
ui->pushButtonZoom->setText(text);
});
m_actionGroup->addAction(newAction(menu, "400%"));
//略
}
void func2(){
.....
for (auto action : m_actionGroup->actions()) {
if (action->text() == text) {
action->setChecked(true);
} else {
action->setChecked(false);
}
}
....
}
发现当action的checkable状态变化时,开关各一次,触发toggled信号,这样就会导致重复操作同一个值 ui->pushButtonZoom->setText(text);
重复赋值
查了下文档:
triggered:当用户激活某个动作时,会发出该信号;例如,当用户单击菜单选项、工具栏按钮或按下操作的快捷键组合时,或者当调用trigger()时。值得注意的是,当调用setChecked()或toggle()时,它不会发出。
如果该操作是可检查的,则如果选中该操作,则选中为true;如果未选中该操作则为false。
toggled:每当可检查操作更改其isChecked()状态时,就会发出此信号。这可能是用户交互的结果,也可能是因为调用了setChecked()。当setChecked()更改QAction时,除了toggled()之外,它还会发出changed()。
如果选中该操作,则checked为true;如果未选中该操作则为false。
注意:已检查属性的通知程序信号。另请参见QAaction::activate()、QAction::triggered()和checked。
再参考:博客
基本确定了是setChecked()多次触发toggled信号。而这里只需要命中时,执行一次操作即可,改用triggered()信号。解决bug