使用for循环分配方法QScrollbars的信号的valueChanged似乎不工作

问题描述 投票:1回答:1

我试图用一个for循环分配方法QScrollbars的信号的valueChanged,使我的代码更干净。然而,这似乎并没有正常工作。我究竟做错了什么?

import sys
from PyQt5.QtWidgets import QScrollBar, QDialog, QVBoxLayout, QApplication


class MainWindow(QDialog):
    def __init__(self):
        super().__init__()
        self.layout = QVBoxLayout(self)
        self.scrollbar1 = QScrollBar(self)
        self.scrollbar2 = QScrollBar(self)
        self.scrollbars = [self.scrollbar1, self.scrollbar2]
        self.names = ['scrollbar 1', 'scrollbar 2']
        self.layout.addWidget(self.scrollbar1)
        self.layout.addWidget(self.scrollbar2)
        for scrollbar, name in zip(self.scrollbars, self.names):
            print(scrollbar, name)
            scrollbar.valueChanged.connect(lambda: self.test(name))

        # self.scrollbar1.valueChanged.connect(
        #     lambda: self.test(self.names[0])
        # )
        # self.scrollbar2.valueChanged.connect(
        #     lambda: self.test(self.names[1])
        # )

        self.show()

    def test(self, scrollbar):
        print(scrollbar)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    GUI = MainWindow()
    sys.exit(app.exec_())

分配方法“手动”就可以工作,即不同的名称被传递。然而,当for循环使用,对于滚动条相同的名称被印刷在一个值的变化。

编辑:这是我的snap_slider方法

旧:

def snap_slider(scrollbar):
    x = np.modf(scrollbar.value() / scrollbar.singleStep())
    if x[0] < 0.5:
        scrollbar.setSliderPosition(
            int(x[1] * scrollbar.singleStep()))
    else:
        scrollbar.setSliderPosition(
            int((x[1]+1) * scrollbar.singleStep()))

新:

def snap_slider(self):
    x = np.modf(self.sender().value() / self.sender().singleStep())
    if x[0] < 0.5:
        self.sender().setSliderPosition(
            int(x[1] * self.sender().singleStep()))
    else:
        self.sender().setSliderPosition(
            int((x[1] + 1) * self.sender().singleStep()))
python pyqt
1个回答
1
投票

这里有几件事情,因为你正试图使你的代码更加清晰:

  • 你应该更喜欢使用sender()方法的一个lambda功能
  • 这是隔离在一个单独的功能,你可以调用其他地方的UI设置一个很好的做法
  • 有关show()方法同样的事情:避免将其放在__init__方法,因为您可能需要实例化一个MainWindow没有表现出它(例如:用于测试目的)

这将使类似:

import sys
from PyQt5.QtWidgets import QScrollBar, QDialog, QVBoxLayout, QApplication

class MainWindow(QDialog):
    def __init__(self):
        super().__init__()
        self.createWidgets()

    def createWidgets(self):
        self.layout = QVBoxLayout(self)

        self.scrollbar1 = QScrollBar(self)
        self.scrollbar2 = QScrollBar(self)

        for widget in [self.scrollbar1, self.scrollbar2]:
            widget.valueChanged.connect(self.test)
            self.layout.addWidget(widget)

    def test(self, event):
        print(self.sender())


if __name__ == '__main__':
    app = QApplication(sys.argv)
    GUI = MainWindow()
    GUI.show()
    sys.exit(app.exec_())
© www.soinside.com 2019 - 2024. All rights reserved.