簡體   English   中英

PyQt5,如何將QSlider從QGroupBox連接到函數

[英]PyQt5, how to connect QSlider from a QGroupBox to a function

我想為滑塊創建一個回調。 但是由於我制作的滑塊是groupbox函數的一部分。 我不確定如何連接它:

def createExampleGroup(self, name, interval, steps, min, max):
    groupBox = QGroupBox(name)
    slider = QSlider(Qt.Horizontal)
    slider.setFocusPolicy(Qt.StrongFocus)
    slider.setTickPosition(QSlider.TicksBothSides)
    slider.setMinimum(min)
    slider.setMaximum(max)
    slider.setTickInterval(interval)
    slider.setSingleStep(steps)
    vbox = QVBoxLayout()
    vbox.addWidget(slider)
    # vbox.addStretch(1)
    groupBox.setLayout(vbox)
    return groupBox

def valueChange(self):
    print ("Update Slider")

self.aGroup = self.createExampleGroup("SliderA",10,10,10,100)
self.bGroup = self.createExampleGroup("SliderB",10,10,10,100)

所以我不確定如何訪問每個組中的滑塊並將它們連接到valueChange 並且還讓valueChange()根據它是哪個滑塊進行不同的更新。 我嘗試了self.aGroup.findChild(QSlider)但是它返回一個地址,所以我不知道如何使用它。 我使用group的原因是我可以在其中添加其他小部件。

有幾個選項供您選擇。 您可以簡單地從函數中返回幾個小部件:

def create_example_group(...) # python naming convention!
    ...
    return group_box, slider

 self.a_group, a_slider = self.create_example_group(...)
 a_slider.changeValue.connect(...)

或者,您可以給滑塊指定一個唯一的名稱,並在組小部件上使用findChildren或類似方法來找到小部件。

findChild返回的是QSlider對象,您可能正在打印它,得到的內容類似於:

<PyQt5.QtWidgets.QSlider object at 0x7f6c521dedc8>

這只是返回__str__ ,您可以在如何使用print()打印類的對象中找到更多信息

所以我可以使用那個對象

slider = self.aGroup.findChild(QSlider)
slider.valueChanged.connect(self.valueChange)

盡管該選項可能有點臟,但從設計的角度來看,更好的選擇是創建一個從QGroupBox繼承並共享信號的類:

class MyGroupBox(QGroupBox):
    valueChanged = pyqtSignal(int)

    def __init__(self, name, interval, steps, min, max):
        super(MyGroupBox, self).__init__(name)
        slider = QSlider(Qt.Horizontal)
        slider.setFocusPolicy(Qt.StrongFocus)
        slider.setTickPosition(QSlider.TicksBothSides)
        slider.setMinimum(min)
        slider.setMaximum(max)
        slider.setTickInterval(interval)
        slider.setSingleStep(steps)
        slider.valueChanged.connect(self.valueChanged)
        vbox = QVBoxLayout()
        vbox.addWidget(slider)
        # vbox.addStretch(1)
        self.setLayout(vbox)

然后,您可以通過以下方式使用它:

self.aGroup = MyGroupBox("SliderA",10,10,10,100)
self.bGroup = MyGroupBox("SliderB",10,10,10,100)
self.aGroup.valueChanged.connect(self.valueChange)

上面給出了一個標識,因為它是一個通過抽象內部元素來顯示某些屬性的類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM