猿问

在小部件之间传递变量 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变量在类中无法识别。


绝地无双
浏览 175回答 1
1回答

潇湘沐

您的代码有许多不一致之处,例如:def Clicked(self,item):&nbsp; &nbsp; click_id = self.item.text()我假设此方法必须返回该项的文本,但该函数不返回任何内容,因此即使正确调用它,您也始终会得到 None。class myTextWidget(QLineEdit):&nbsp; &nbsp; def change_text(self):&nbsp; &nbsp; &nbsp; &nbsp; click_id = myListWidget.Clicked&nbsp; &nbsp; &nbsp; &nbsp; self.setText = item_dict[click_id]您尝试使用 myListWidget.Clicked,但这永远不会起作用,因为要使用方法,除了调用函数之外,还需要一个对象,您必须使用括号并在必要时传递参数。从上面,我假设你对OOP的了解并不根深蒂固,所以建议你回顾一下你关于这个主题的笔记,因为Qt会大量使用它们。因此,必须重写代码。当您将项目添加到QListWidget时,您将转换为字符串,当您检索它时,它也将是一个字符串,因此它不能用于访问字典的关联值,因此为了避免这种转换,您可以直接使用Qt::D isplayRole角色,因此将显示数字,并且值将作为数字检索。另一方面,永远不要假设一切正常,但你必须验证,例如,你可以使用“get()”而不是使用“[]”,在第一种情况下,如果密钥不存在,将引发异常,并在第二个,无或默认值中返回。考虑到上述情况,解决方案如下:import sysfrom PySide2 import QtCore, QtGui, QtWidgetsitem_dict = {1: "First Item", 2: "Second Item", 3: "Third Item"}item_list = [1, 2, 3]class Widget(QtWidgets.QWidget):&nbsp; &nbsp; def __init__(self, parent=None):&nbsp; &nbsp; &nbsp; &nbsp; super(Widget, self).__init__(parent)&nbsp; &nbsp; &nbsp; &nbsp; self.listwidget = QtWidgets.QListWidget()&nbsp; &nbsp; &nbsp; &nbsp; self.lineedit = QtWidgets.QLineEdit()&nbsp; &nbsp; &nbsp; &nbsp; lay = QtWidgets.QVBoxLayout(self)&nbsp; &nbsp; &nbsp; &nbsp; lay.addWidget(self.listwidget)&nbsp; &nbsp; &nbsp; &nbsp; lay.addWidget(self.lineedit)&nbsp; &nbsp; &nbsp; &nbsp; for e in item_list:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; it = QtWidgets.QListWidgetItem()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; it.setData(QtCore.Qt.DisplayRole, e)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.listwidget.addItem(it)&nbsp; &nbsp; &nbsp; &nbsp; self.listwidget.itemClicked.connect(self.on_item_clicked)&nbsp; &nbsp; @QtCore.Slot(QtWidgets.QListWidgetItem)&nbsp; &nbsp; def on_item_clicked(self, item):&nbsp; &nbsp; &nbsp; &nbsp; key = item.data(QtCore.Qt.DisplayRole)&nbsp; &nbsp; &nbsp; &nbsp; value = item_dict.get(key)&nbsp; &nbsp; &nbsp; &nbsp; if value is not None:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; self.lineedit.setText(value)def main():&nbsp; &nbsp; app = QtWidgets.QApplication(sys.argv)&nbsp; &nbsp; window = Widget()&nbsp; &nbsp; window.show()&nbsp; &nbsp; sys.exit(app.exec_())if __name__ == "__main__":&nbsp; &nbsp; main()
随时随地看视频慕课网APP

相关分类

Python
我要回答