繁体   English   中英

在小部件 Pyside2 之间传递变量

[英]Passing Variables between Widgets 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 变量。

您的代码有很多不一致之处,例如:

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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM