发现自从开始使用QT和OpenGL后就到处踩坑。
因为需要使用QT和OpenGL显示三维图像,整体上就是QT负责界面,OpenGL负责显示。界面需要的操作比较多,这个时候就必然是信号槽主场,然而我被他们快坑惨了。
问题出在QSlider这个控件上,因为需要调整控件范围,需要使用下面的函数:
slider->setMaximum(num);
这个函数用来设置QSlider的最大值,但是因为我在调用这个函数之前进行了connect信号槽的连接
connect(ui.slider, SIGNAL(valueChanged(int)),this, SLOT(onIndexChanged(int)), Qt::UniqueConnection);
将控件的valuechanged信号进行了绑定,本来以为只要不使用setValue函数就不会触发该信号槽,但是在使用setMaximum设置最大值的时候发现触发了valuechanged信号,也就是说会触发处理槽函数。我在使用的槽函数中有对OpenGL显示的控制,但是OpenGL对一些函数的使用顺序是有严格要求的,所以会出错,而OpenGL本身不报错,所以会很难定位错误。
解决方法目前想到两种:
第一种,在设置完最值之后再进行信号槽的绑定。
第二种,使用信号拦截函数,将有设置最值而产生的信号进行拦截。
slider->blockSignals(true);
slider->blockSignals(false);
这样在设置最值的时候对信号拦截,之后再开放信号。
ComboBox的addItems函数也有类似的情况。