如何仅在释放鼠标左键后触发功能 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()?的主要内容,如果未能解决你的问题,请参考以下文章

jQuery mouseup 功能仅在鼠标左键上?

java中如何获取网页中鼠标点击过的事件

Blender甜甜圈教程笔记

Tkinter 按钮仅在单击左键时才会下沉

鼠标的点击事件&点击的5中状态

鼠标事件