设计方案1:
在PC上,当使用QDial调节音量时,触发QDial的SIGNAL:ValueChange(),对应SLOT向LPC发送自定义键码0x22;
在LPC上,当接收到0x22键码时,执行操作:设置当前volume值,当设置完成后,PC将接收到来自LPC的volume数据进行更新。
发现问题:
1、当触发ValueChange()信号时,由于LPC设置3s无活动自动进入音量显示界面,PC每隔3s仍发送0x22键码,导致VFD一直显示0x22键码,其他按键可以正常使用,但是操作执行完成后依然进入0x22的显示界面且每隔3s闪烁一次(原因应该是显示了volume界面但马上又被0x22刷新)。
2、发送的数据只有一个Byte可以搭载数据,搭载命令数据之后就无法搭载音量数据,改写协议又相对麻烦。
3、由于显示0x22也是其中一个功能码操作,在LPC中设置了3秒延时,因此才会有问题1的问题。必须关掉对0x22键码设置延时。
设计方案2:
设置一个Volume的镜像变量Volume_2(Volume_2设为全局变量),QDial获取Volume_2的值并与当前值做判断,得出方向后发送Volume+(ADKey5)和Volume-(ADKey6)的信号给LPC,直接执行加减操作。
发现问题:
1、用QDial控件的触发信号ValueChange()会导致音量一直为零,原因是在发生Value的变触发发送改变音量的函数,导致音量持续改变;
2、用release()做触发信号在数值改变的过程中LPC不响应,每次不论将数值调整为多少,都只做一次改变。
3、底部用于显示音量的Label无ValueChange的触发信号。
解决办法:
去掉Lbl控件,改用SpinBox并与QDial建立信号-槽关系,将spinbox的button隐藏(看起来就和Label一样了),用spinbox的valuechange作为触发信号。这样可以保证value随QDial实时改变,问题基本解决,但效果不太理想。由于使用循环,在实时改变数值的时候每改变一个单位都要计算一次差值,导致出现明显抖动。尚无解决办法。
注意:
1、在进行功能实现时,尽量避免使用全局变量,减少移植难度和空间占用;
2、不可改写现有通信协议。