Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用QSignalMapper_Python_Pyside2_Qsignalmapper - Fatal编程技术网

Python 使用QSignalMapper

Python 使用QSignalMapper,python,pyside2,qsignalmapper,Python,Pyside2,Qsignalmapper,我试着做一个简单的例子来帮助理解QSignalMapping的概念在PySide中是如何工作的。我希望通过循环来动态创建一系列按钮,当用户按下其中一个按钮时,我可以激活一个方法,为按下的按钮返回适当的标签 from PySide2 import QtWidgets,QtCore,QtGui fruit_list = ["apples","oranges","pears"] def fruit_button_event(): print "this is the pressed but

我试着做一个简单的例子来帮助理解QSignalMapping的概念在PySide中是如何工作的。我希望通过循环来动态创建一系列按钮,当用户按下其中一个按钮时,我可以激活一个方法,为按下的按钮返回适当的标签

from PySide2 import QtWidgets,QtCore,QtGui

fruit_list = ["apples","oranges","pears"]

def fruit_button_event():
    print "this is the pressed button's label"

def main():
    for fruit in fruit_list:
        fruit_button = QtWidgets.QPushButton(fruit)
        fruit_button.clicked.connect(lambda:fruit_button_event())
main()

在下一部分中,我将展示一个如何使用QSignalMapper的示例:

from PySide2 import QtCore, QtWidgets


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        lay = QtWidgets.QVBoxLayout(self)

        fruit_list = ["apples","oranges","pears"]
        mapper =  QtCore.QSignalMapper(self)
        mapper.mapped[str].connect(self.fruit_button_event)

        for fruit in fruit_list:
            btn = QtWidgets.QPushButton(fruit)
            btn.clicked.connect(mapper.map)
            mapper.setMapping(btn, fruit)
            lay.addWidget(btn)

    @QtCore.Slot(str)
    def fruit_button_event(self, text):
        print("this is the pressed button's label", text)


if __name__ == '__main__':
    import sys

    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())
请记住,不推荐使用from:

这个类已经过时了。它是用来保存旧的源代码的 工作我们强烈建议不要在新代码中使用它


使用functools可以获得python中相同的功能。部分(…):

或使用lambda:

btn.clicked.connect(lambda text=fruit: self.fruit_button_event(text))
或QButtonGroup:

class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        lay = QtWidgets.QVBoxLayout(self)

        fruit_list = ["apples","oranges","pears"]
        group = QtWidgets.QButtonGroup(self)
        group.buttonClicked.connect(self.OnButtonClicked)

        for fruit in fruit_list:
            btn = QtWidgets.QPushButton(fruit)
            group.addButton(btn)
            lay.addWidget(btn)

    @QtCore.Slot(QtWidgets.QAbstractButton)
    def OnButtonClicked(self, btn):
        print("this is the pressed button's label", btn.text())

不要使用
QSignalMapper
:使用。感谢您提供的示例和建议,有什么替代方案?针对C++中PySID2?@ WiTalAlFS的正确方法,建议使用Python中的lambDas,建议使用FrimoStudio.Pultal.(),我将向您展示一个示例。另一方面,如果我的答案对您有帮助,请不要忘记将其标记为正确,如果您不知道如何做,请查看,这是表示感谢的最佳方式。在您的Python示例中,是否有一种方法可以在不使用水果按钮事件方法上的装饰器的情况下工作?@winteralfs您可以删除它,decorator的优点是连接速度更快,因为连接是在C++中提供的,因为使用的资源更少,所以我建议使用decorator,尽管它不是强制性的。如果我删除它,我是否需要添加任何其他代码来替换它?
class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super(Widget, self).__init__(parent)
        lay = QtWidgets.QVBoxLayout(self)

        fruit_list = ["apples","oranges","pears"]
        group = QtWidgets.QButtonGroup(self)
        group.buttonClicked.connect(self.OnButtonClicked)

        for fruit in fruit_list:
            btn = QtWidgets.QPushButton(fruit)
            group.addButton(btn)
            lay.addWidget(btn)

    @QtCore.Slot(QtWidgets.QAbstractButton)
    def OnButtonClicked(self, btn):
        print("this is the pressed button's label", btn.text())