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()
添加回答
舉報