首先遇到的问题:
今天在使用Qt对QComboBox控件添加内容时,不管是用下列两个函数中的哪个都会出问题。
void QComboBox::addItem(const QString &text, const QVariant &userData = QVariant())
void QComboBox::insertItem(int index, const QString &text, const QVariant &userData = QVariant())
之后对添加的内容、函数的使用方法甚至是ComboBox的属性都进行了再三确认,也在新工程上测试过,还是不行。
最后终于发现问题所在了:我的项目在构造函数中对该comboBox对象调用了信号槽连接,
即: QObject::connect(ui->comboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(comboBoxSlot()));
应该在调用QComboBox::addItem函数之前使用一下:
QObject::disconnect(ui->comboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(comboBoxSlot()));
在添加完成后再调用:
QObject::connect(ui->comboBox,SIGNAL(currentIndexChanged(int)),this,SLOT(comboBoxSlot())); 即可。
总结:
如果对ComboBox有做信号槽连接,那么在对其内容进行修改时应该先将信号槽连接断开,操作完成后再连接
给一个创建了信号槽的ComboBox添加或去除Item时采用的方法是在对该ComboBox操作前先使用disconn函数将信号槽先切断,操作好后在connect。
上文另解:
今天发现有另一种解决方法,就是使用blockSignals函数。
该函数的原型:bool QObject::blockSignals(bool block)
官方解释:If block is true, signals emitted by this object are blocked (i.e., emitting a signal will not invoke anything connected to it). If block is false, no such blocking will occur.
理解:如果block为真,阻塞信号,或者如果block为假,取消信号阻塞。如果信号被阻塞,被发射的信号消失在超空间
所以可以在addItem和insertItem之前设置blockSignals(true),之后设置成blockSignals(false)