QT总结5-setMaximum与valuechanged坑

探讨了在使用QT和OpenGL进行三维图像显示时遇到的信号槽问题,特别是在QSlider和ComboBox控件上的操作引发的意外信号触发,以及OpenGL对函数调用顺序的敏感性导致的错误。提供了两种解决方案:调整信号槽绑定时机和使用信号拦截。

发现自从开始使用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函数也有类似的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值