我试图举一个简单的例子来帮助理解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()
答案 0 :(得分:0)
在下一部分中,我将显示一个示例如何使用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中的内容:
该课程已过时。提供它是为了保留旧的源代码 工作。强烈建议您不要在新代码中使用它。
可以通过 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())