PyQt5如何将QListWidget点击项的数据传递到另一个.py文件?
解决PyQt5 QListWidget选中项数据传递到外部文件的错误问题
错误原因
你在B.py中直接调用Example().onClicked()时,没有传入item参数,这是因为onClicked是绑定itemDoubleClicked信号的槽函数——只有当用户双击列表项时,信号才会自动传入被点击的item对象。手动调用槽函数既不符合PyQt的信号槽机制,也无法正确传递数据。
解决方案1:使用自定义信号传递数据
修改A.py,定义自定义信号,当用户双击列表项时发射信号传递选中数据:
import sys from PyQt5.QtWidgets import (QListWidget, QWidget, QVBoxLayout, QApplication) from PyQt5.QtCore import pyqtSignal class Example(QWidget): # 定义自定义信号,用于传递字符串类型的选中项文本 item_selected = pyqtSignal(str) def __init__(self): super().__init__() self.initUI() def initUI(self): vbox = QVBoxLayout(self) self.listWidget = QListWidget() self.listWidget.addItem("sparrow") self.listWidget.addItem("robin") self.listWidget.addItem("crow") self.listWidget.itemDoubleClicked.connect(self.onClicked) vbox.addWidget(self.listWidget) self.setLayout(vbox) self.setGeometry(300, 300, 350, 250) self.setWindowTitle('QListWidget') self.show() def onClicked(self, item): selected_text = item.text() print(selected_text) # 发射自定义信号,传递选中的文本数据 self.item_selected.emit(selected_text) def main(): app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main()
修改B.py,监听A类的自定义信号并处理数据:
import sys from PyQt5.QtWidgets import QApplication from A import Example def handle_selected_data(text): # 在这里编写数据处理逻辑 print(f"B.py收到选中项数据:{text}") if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() # 将自定义信号绑定到数据处理函数 ex.item_selected.connect(handle_selected_data) sys.exit(app.exec_())
解决方案2:使用回调函数传递数据
修改A.py,初始化时接受一个回调函数,点击项时调用该函数传递数据:
import sys from PyQt5.QtWidgets import (QListWidget, QWidget, QVBoxLayout, QApplication) class Example(QWidget): def __init__(self, callback=None): super().__init__() self.callback = callback # 保存外部传入的回调函数 self.initUI() def initUI(self): vbox = QVBoxLayout(self) self.listWidget = QListWidget() self.listWidget.addItem("sparrow") self.listWidget.addItem("robin") self.listWidget.addItem("crow") self.listWidget.itemDoubleClicked.connect(self.onClicked) vbox.addWidget(self.listWidget) self.setLayout(vbox) self.setGeometry(300, 300, 350, 250) self.setWindowTitle('QListWidget') self.show() def onClicked(self, item): selected_text = item.text() print(selected_text) # 如果存在回调函数,调用并传递数据 if self.callback: self.callback(selected_text) def main(): app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_()) if __name__ == '__main__': main()
修改B.py,传入回调函数接收数据:
import sys from PyQt5.QtWidgets import QApplication from A import Example def handle_data(text): # 在这里编写数据处理逻辑 print(f"B.py获取到选中项数据:{text}") if __name__ == '__main__': app = QApplication(sys.argv) # 初始化Example时传入回调函数 ex = Example(callback=handle_data) sys.exit(app.exec_())
内容的提问来源于stack exchange,提问作者CHL
相关产品推荐
相关产品推荐

