1 回答

TA贡献1816条经验 获得超6个赞
您的代码有许多不一致之处,例如:
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::D isplayRole角色,因此将显示数字,并且值将作为数字检索。另一方面,永远不要假设一切正常,但你必须验证,例如,你可以使用“get()”而不是使用“[]”,在第一种情况下,如果密钥不存在,将引发异常,并在第二个,无或默认值中返回。考虑到上述情况,解决方案如下:
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()
添加回答
举报