开发者社区> 问答> 正文

在小部件Pyside2之间传递变量

我试图弄清楚如何使用PySide2在列表窗口小部件和行编辑窗口小部件之间传递值。我有一个包含三个键的字典,以及一个与三个字典键具有相同值的列表。当用户单击列表框中的值时,我希望它从字典键值对中返回该值。如果我在代码中手动输入键,则可以从字典中检索值,但无法从列表小部件中接受键。这是我要使用的代码:

import sys
from PySide2.QtGui import \*        from PySide2.QtCore import \*        from PySide2.QtWidgets import QLineEdit, QApplication, QMessageBox, QListWidget
from PySide2 import QtWidgets


item_dict = {1: "First Item",
            2: "Second Item",
            3: "Third Item"}

item_list = [1,2,3]

class myListWidget(QListWidget):
    def Clicked(self,item):
        click_id = self.item.text()

class myTextWidget(QLineEdit):
    def change_text(self):
        click_id = myListWidget.Clicked
        self.setText = item_dict[click_id]

def main():
    app = QApplication(sys.argv)
    window = QtWidgets.QWidget()
    layout = QtWidgets.QVBoxLayout(window)
    listWidget = myListWidget()
    for i in item_dict:
       listWidget.addItem(str(i))

    TextWidget = myTextWidget()

    #listWidget.itemClicked.connect(listWidget.Clicked)
    listWidget.itemClicked.connect(myTextWidget.change_text)

    layout.addWidget(listWidget)
    layout.addWidget(TextWidget)
    window.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()

当我单击列表窗口小部件时,出现以下错误:

Traceback (most recent call last):
  File "C:\Users\Mythranor\Desktop\VN Builder\PyQtTut\listview2.py", line 21, in change_text
    self.setText = item_dict[click_id]
KeyError: <function myListWidget.Clicked at 0x000002B6286A8F78>

我也尝试过直接在change_text函数中调用listWidget.item.text,但是它说listWidget变量在类中无法识别。

问题来源:stackoverflow

展开
收起
is大龙 2020-03-24 19:13:37 1341 0
1 条回答
写回答
取消 提交回答
  • 您的代码有许多不一致之处,例如:

    def Clicked(self,item):
        click_id = self.item.text()
    

    我认为此方法必须返回项目的文本,但是该函数不返回任何内容,因此即使正确调用该方法,也始终会得到None。

    class myTextWidget(QLineEdit):
        def change_text(self):
            click_id = myListWidget.Clicked
            self.setText = item_dict[click_id]
    

    您尝试使用myListWidget.Clicked,但这将永远无法工作,因为要使用一种方法,除了要调用函数外,还需要一个对象,必须使用括号并在必要时传递参数。

    根据以上情况,我认为您不了解OOP,因此建议您复习有关该主题的笔记,因为Qt大量使用它们。

    *因此,必须重写代码。当您将项目添加到QListWidget时,您将转换为字符串,并且在检索它时,它还将也是一个字符串,因此不能用于访问字典的关联值,因此要避免这种转换,您可以使用Qt :: DisplayRole角色,因此将显示数字,并将值检索为数字。另一方面,永远不要假设一切正常,但是您必须进行验证,例如,可以使用“ get()”代替“ []”,在第一种情况下,如果键不存在,则会引发异常在第二种情况下,将返回None或默认值。考虑到上述情况,解决方案如下: import sys from PySide2 import QtCore, QtGui, QtWidgets

    item_dict = {1: "First Item", 2: "Second Item", 3: "Third Item"}
    
    item_list = [1, 2, 3]
    
    
    class Widget(QtWidgets.QWidget):
        def __init__(self, parent=None):
            super(Widget, self).__init__(parent)
            self.listwidget = QtWidgets.QListWidget()
            self.lineedit = QtWidgets.QLineEdit()
    
            lay = QtWidgets.QVBoxLayout(self)
            lay.addWidget(self.listwidget)
            lay.addWidget(self.lineedit)
    
            for e in item_list:
                it = QtWidgets.QListWidgetItem()
                it.setData(QtCore.Qt.DisplayRole, e)
                self.listwidget.addItem(it)
    
            self.listwidget.itemClicked.connect(self.on_item_clicked)
    
        @QtCore.Slot(QtWidgets.QListWidgetItem)
        def on_item_clicked(self, item):
            key = item.data(QtCore.Qt.DisplayRole)
            value = item_dict.get(key)
            if value is not None:
                self.lineedit.setText(value)
    
    
    def main():
        app = QtWidgets.QApplication(sys.argv)
        window = Widget()
        window.show()
        sys.exit(app.exec_())
    
    
    if __name__ == "__main__":
        main()
    

    回答来源:stackoverflow

    2020-03-24 19:13:47
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载