如何仅在松开鼠标左键后触发函数 dial.valueChanged.connect()?

How to trigger function dial.valueChanged.connect() only once the left mouse button is released?

背景

我想通过 Python Gui (PyQt) 组件“QDial”控制伺服电机。希望伺服电机应该与 GUI 中的 Dial 一起旋转“同时”。

相关代码如下:

Arduino

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 的勾号时,效果很好。点击后,函数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)?或者有什么办法解决这个问题?

如果你想在鼠标松开时调用writeToSerial那么你必须使用sliderReleased信号:

self.dial.sliderReleased.connect(self.writeToSerial)

另一方面,问题在于您没有对字符串进行定界,以便在解码时知道信息何时结束,例如,如果将结束行用作定界符,那么您可以获得数据如下:

self.ser.write("{}\n".format(self.posAngle).encode())
posOrder = Serial.readStringUntil('\n');