gpt4 book ai didi

python - 使用 QSignalMapper

转载 作者:行者123 更新时间:2023-12-01 09:03:20 25 4
gpt4 key购买 nike

我尝试制作一个简单的示例来帮助理解 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_())

请记住,来自 Qt 5.10 QSignalMapper已弃用:

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


使用 functools.partial(...) 可以在 python 中获得相同的功能:

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)

或者使用 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())

关于python - 使用 QSignalMapper,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52283469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com