如何仅在释放鼠标左键后触发功能 dial.valueChanged.connect()?
Posted
技术标签:
【中文标题】如何仅在释放鼠标左键后触发功能 dial.valueChanged.connect()?【英文标题】:How to trigger function dial.valueChanged.connect() only once the left mouse button is released? 【发布时间】:2020-07-04 19:54:17 【问题描述】:背景
我想通过 Python Gui (PyQt) 组件“QDial”控制伺服电机。希望伺服电机应与 GUI 中的拨盘“同时”旋转。
下面是相关代码:
阿杜诺
void loop()
// while(!Serial) //
if(Serial.available()>0)
posOrder = Serial.readString(); // get Angle-Value from Serial
// write to Serial Monitor
Serial.print("Set Servo Position to: ");
Serial.println(posOrder);
int angle = posOrder.toInt();
myservo.write(angle);
Serial.flush();
delay(30);
QDial
## ....some code...
self.dial.valueChanged.connect(self.writeToSerial)
## ...
def writeToSerial(self):
# create serial connection
self.ser = serial.Serial(self.portPath, timeout=None, baudrate=self.baudRate)
self.posAngle = self.dial.value() # get value
self.ser.write(str(self.posAngle).encode()) # write to Serial
问题
当我点击表盘的勾号时,它工作得很好。点击后dial.valueChanged.connect(self.writeToSerial)
函数会调用writeToSerial()
函数,它有足够的时间将拨号值写入Serial。串口监视器显示:
Set Servo Position to: 65
Set Servo Position to: 30
Set Servo Position to: 170
但是当我按住鼠标左键旋转表盘时,函数dial.valueChanged.connect(self.writeToSerial)
会在每一个小步骤中被调用。也就是说writeToSerial()
函数会被疯狂频繁调用,serial.write()
函数不能及时写入数据。串行监视器显示如下:
Set Servo Position to: 65666770717273747677
Set Servo Position to: 99100104108109114116119122126128130131133
Set Servo Position to: 1411421431441451461481501521541561
问题
是否只有松开鼠标左键才能触发函数dial.valueChanged.connect(self.writeToSerial)
?或者有什么其他想法可以解决这个问题?
【问题讨论】:
【参考方案1】:如果您想在释放鼠标时调用writeToSerial
,那么您必须使用sliderReleased
信号:
self.dial.sliderReleased.connect(self.writeToSerial)
另一方面,问题在于您没有分隔字符串,以便在解码时知道信息何时结束,例如,如果结束行用作分隔符,那么您可以在方式如下:
self.ser.write("\n".format(self.posAngle).encode())
posOrder = Serial.readStringUntil('\n');
【讨论】:
不错的答案!到第二种方法。它比以前好得多。但我仍然可以在串行监视器中看到一些 posOrder,例如:Set Servo Position to: 4543, Set Servo Position to: 549. 很少出现,但一旦出现会导致伺服电机摆动。 @sun0727 也许更复杂的协议会有所帮助,或者更好地验证数据是否有效,例如:if(angle > 0 && angle < 180) /**/
非常感谢,是否也可以设置只能逐步滑动的表盘,例如10°,即使我按住鼠标按钮滑动它?
@sun0727 可能是的,但这是一个从您的原始问题中逃脱的问题,因此您必须创建另一个帖子以上是关于如何仅在释放鼠标左键后触发功能 dial.valueChanged.connect()?的主要内容,如果未能解决你的问题,请参考以下文章