网站建设渠道百度指数1000搜索量有多少
QT当中经常用到信号,信号大部分是需要触发的,但有时也不需要触发,需要临时关闭,QT控件本身就有这种能力,用这种能力,可以很好的控制控件的信号,让它得到很好的使用。
下面,我就说今天在实际工作当中遇上一个需要临时关闭信号的情况:
代码简化如下:
Example1::Init()
{int currentIndex = 1;for (size_t i = 0; i < pCommu->size(); ++i){log_debug("here");ui->cbx->insertItem(i, "test"));}ui->cbx->setCurrentIndex(currentIndex);
}void Example1::on_cbx_currentIndexChanged(int index)
{.....
}
在代码运行时,总是没有得到,我想要的效果,就是下拉框里(ui->cbx)显示的,不是我设置值,
我跟踪代码发现,是由于代码执行到:ui->cbx->InsertItem时,触发了:on_cbx_currentIndexChanged(int index)事件,这个事件里面,正好又修改了下拉框的值,这显然不是我想要的效果,这一个事件,我只想让用户选择时起作用,不是在初始化时起作用。
那怎么办?
这时就用到了信号的控制,代码改成如下:
Example1::Init()
{ui->cbx->blockSignals(true);int currentIndex = 1;for (size_t i = 0; i < pCommu->size(); ++i){log_debug("here");ui->cbx->insertItem(i, "test"));}ui->cbx->setCurrentIndex(currentIndex);ui->cbx->blockSignals(false);
}void Example1::on_cbx_currentIndexChanged(int index)
{.....
}
加了:
ui->cbx->blockSignals(true);
ui->cbx->blockSignals(false);
这两行代码,问题就解决了,第一行代码,是屏蔽了cbx控件的信号,第二行代码,又放开了这一个信号,这样问题就解决了。