Передача переменных между виджетами Pyside2 - PullRequest
1 голос
/ 11 марта 2020

Я пытаюсь выяснить, как передавать значения между виджетом списка и виджетом редактирования строки, используя 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>

Я также попытался вызвать listWidget.item. .text непосредственно в функции change_text, но он говорит, что переменная listWidget не распознается в классе.

1 Ответ

1 голос
/ 11 марта 2020

Ваш код имеет много несоответствий, например:

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