使用 QSignalMapper [英] Using QSignalMapper

查看:75
本文介绍了使用 QSignalMapper的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

from PySide2 import QtWidgets,QtCore,QtGuiFruit_list = [苹果",橙子",梨"]def Fruit_button_event():打印这是按下按钮的标签"定义主():对于fruit_list 中的水果:Fruit_button = QtWidgets.QPushButton(fruit)Fruit_button.clicked.connect(lambda:fruit_button_event())主要的()

解决方案

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

from PySide2 import QtCore, QtWidgets类小部件(QtWidgets.QWidget):def __init__(self, parent=None):super(Widget, self).__init__(parent)躺 = QtWidgets.QVBoxLayout(self)Fruit_list = [苹果",橙子",梨"]映射器 = QtCore.QSignalMapper(self)mapper.mapped[str].connect(self.fruit_button_event)对于fruit_list 中的水果:btn = QtWidgets.QPushButton(fruit)btn.clicked.connect(mapper.map)mapper.setMapping(btn,水果)Lay.addWidget(btn)@QtCore.Slot(str)def Fruit_button_event(self, text):打印(这是按下按钮的标签",文本)如果 __name__ == '__main__':导入系统app = QtWidgets.QApplication(sys.argv)w = 小部件()w.show()sys.exit(app.exec_())

请记住,Qt 5.10 QSignalMapper 已弃用:><块引用>

这个类已经过时了.提供它以保留旧的源代码在职的.我们强烈建议不要在新代码中使用它.

<小时>

python 中的相同功能可以通过 functools.partial(...) 获得:

from PySide2 import QtCore, QtWidgets从 functools 导入部分类小部件(QtWidgets.QWidget):def __init__(self, parent=None):super(Widget, self).__init__(parent)躺 = QtWidgets.QVBoxLayout(self)Fruit_list = [苹果",橙子",梨"]对于fruit_list 中的水果:btn = QtWidgets.QPushButton(fruit)btn.clicked.connect(partial(self.fruit_button_event,fruit))Lay.addWidget(btn)@QtCore.Slot(str)def Fruit_button_event(self, text):打印(这是按下按钮的标签",文本)

或者使用 lambda:

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

或 QButtonGroup:

类小部件(QtWidgets.QWidget):def __init__(self, parent=None):super(Widget, self).__init__(parent)躺 = QtWidgets.QVBoxLayout(self)Fruit_list = [苹果",橙子",梨"]group = QtWidgets.QButtonGroup(self)group.buttonClicked.connect(self.OnButtonClicked)对于fruit_list 中的水果:btn = QtWidgets.QPushButton(fruit)group.addButton(btn)Lay.addWidget(btn)@QtCore.Slot(QtWidgets.QAbstractButton)def OnButtonClicked(self, btn):print("这是按下按钮的标签", btn.text())

I tried to make a simple example to help understand how the concept of QSignalMapping works in PySide. I would like to dynamically create a series of buttons by iterating through a loop, and when the user pushes one of the buttons, I can activate a method that returns the appropriate label for the button that was pressed.

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()

解决方案

In the next part I show an example how to use 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_())

Remember that from Qt 5.10 QSignalMapper is deprecated:

This class is obsolete. It is provided to keep old source code working. We strongly advise against using it in new code.


The same functionality in python can be obtained with functools.partial(...):

from PySide2 import QtCore, QtWidgets
from functools import partial


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

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

        for fruit in fruit_list:
            btn = QtWidgets.QPushButton(fruit)
            btn.clicked.connect(partial(self.fruit_button_event, fruit))
            lay.addWidget(btn)

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

Or with lambda:

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

Or 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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆