2017-06-02 47 views
0

我在一个循环中创建多个小部件,并且它们都共享相同的回调。我的问题是确定触发回调的小部件。当多个小部件共享相同的回调时识别源小部件

我试着给小部件的指数回调的这样一个论点:

from PyQt5.QtCore import Qt 
from PyQt5.QtWidgets import QApplication, QSlider, QVBoxLayout, QWidget 
import sys 

class Foo(QWidget): 
    def __init__(self, parent=None): 
    super().__init__(parent) 

    self.sliders = [] 
    for n in range(10): 
     slider = QSlider(Qt.Horizontal) 
     slider.valueChanged.connect(lambda: self.on_slider(n)) 
     self.sliders.append(slider) 

    layout = QVBoxLayout() 
    for slider in self.sliders: 
     layout.addWidget(slider) 
    self.setLayout(layout) 

    def on_slider(self, n): 
    print(n) 


app = QApplication(sys.argv) 
gui = Foo() 
gui.show() 
sys.exit(app.exec()) 

但是这个打印9对于移动有滑。

回答

1

以获得物体已经发射的信号有几种形式,如:

  1. 必须先通过一个返回信号,然后将其它参数的参数。

slider.valueChanged.connect(lambda val, n=n: self.on_slider(val, n)) 

[...] 

def on_slider(self, val, n): 
    print(n, val) 

完整代码:

class Foo(QWidget): 
    def __init__(self, parent=None): 
    super().__init__(parent) 

    self.sliders = [] 
    for n in range(10): 
     slider = QSlider(Qt.Horizontal) 
     slider.valueChanged.connect(lambda val, n=n: self.on_slider(val, n)) 
     self.sliders.append(slider) 

    layout = QVBoxLayout() 
    for slider in self.sliders: 
     layout.addWidget(slider) 
    self.setLayout(layout) 

    def on_slider(self, val, n): 
    print(n) 

2-另一种方法是使用objectNamesetObjectNamesender函数,返回发射信号的对象。


for n in range(10): 
     slider = QSlider(Qt.Horizontal) 
     slider.setObjectName(str(n)) 
     slider.valueChanged.connect(self.on_slider) 

[...] 

def on_slider(self, val): 
    print(self.sender().objectName(), val) 

完整代码:

class Foo(QWidget): 
    def __init__(self, parent=None): 
    super().__init__(parent) 
    layout = QVBoxLayout(self) 

    for n in range(10): 
     slider = QSlider(Qt.Horizontal) 
     slider.setObjectName(str(n)) 
     slider.valueChanged.connect(self.on_slider) 
     layout.addWidget(slider) 

    def on_slider(self, val): 
    print(self.sender().objectName(), val) 
+0

再试一次请,我已校正码 – eyllanesc