我的代码创建了一个复合小部件,它由一个按钮和一个标签组成。
它是更广泛代码的一部分,其中该复合小部件是列表的元素。
但现在让我们关注我的问题:
如何在运行时了解 QPushButton 中的文本?
这是代码:
myList = QListWidget(layout)
...
#this happens within a loop inside a method of the class
item = QtWidgets.QListWidgetItem()
item_widget = QtWidgets.QWidget()
line_push_button = QtWidgets.QPushButton("text I want to get")
line_push_button.clicked.connect(self.clicked)
line_text = QtWidgets.QLabel("some text")
item_layout = QtWidgets.QHBoxLayout()
item_layout.addWidget(line_push_button)
item_layout.addWidget(line_text)
item_widget.setLayout(item_layout)
myList.insertItem(i, item)
myList.setItemWidget(item, item_widget)
在运行时我可以访问
myList
,然后我需要循环遍历列表中的项目,访问每个项目的按钮中的文本。您可以使用 functools.partial 或带有可选参数的 lambda 在点击处理程序中捕获发件人
from PyQt5 import QtWidgets
import functools
if __name__ == "__main__":
app = QtWidgets.QApplication([])
parent = QtWidgets.QWidget()
layout = QtWidgets.QVBoxLayout()
def click_handler(sender):
QtWidgets.QMessageBox.information(parent, "Clicked", sender.text())
for text in ['one', 'two', 'three']:
line_push_button = QtWidgets.QPushButton(text)
# functools.partial
line_push_button.clicked.connect(functools.partial(click_handler, sender=line_push_button))
# lambda with optional argument
# line_push_button.clicked.connect(lambda on, sender=line_push_button: click_handler(sender))
layout.addWidget(line_push_button)
parent.setLayout(layout)
parent.show()
app.exec()