在小部件 Pyside2 之间传递变量
Passing Variables between Widgets Pyside2
我正在尝试弄清楚如何使用 PySide2 在列表小部件和行编辑小部件之间传递值。我有一个包含三个键的字典和一个与三个字典键具有相同值的列表。当用户单击列表框中的值时,我希望它 return 来自字典键值对的值。如果我在代码中手动输入键,我可以从字典中检索值,但我无法让它接受列表小部件中的值。这是我尝试使用的代码:
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 变量在 class.
中无法识别
您的代码有很多不一致之处,例如:
def Clicked(self,item):
click_id = self.item.text()
我认为此方法必须 return 项目的文本,但该函数不会 return 任何东西,因此即使它被正确调用,您也总是会得到 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 或默认值将被 returned。综合以上,解决方案如下:
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()
我正在尝试弄清楚如何使用 PySide2 在列表小部件和行编辑小部件之间传递值。我有一个包含三个键的字典和一个与三个字典键具有相同值的列表。当用户单击列表框中的值时,我希望它 return 来自字典键值对的值。如果我在代码中手动输入键,我可以从字典中检索值,但我无法让它接受列表小部件中的值。这是我尝试使用的代码:
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 变量在 class.
中无法识别您的代码有很多不一致之处,例如:
def Clicked(self,item):
click_id = self.item.text()
我认为此方法必须 return 项目的文本,但该函数不会 return 任何东西,因此即使它被正确调用,您也总是会得到 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 或默认值将被 returned。综合以上,解决方案如下:
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()