亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在小部件之間傳遞變量 Pyside2

在小部件之間傳遞變量 Pyside2

絕地無雙 2022-08-25 15:18:04
我試圖弄清楚如何使用PySide2在列表小部件和行編輯小部件之間傳遞值。我有一個包含三個鍵的字典和一個與三個字典鍵具有相同值的列表。當用戶單擊列表框中的值時,我希望它從字典鍵值對中返回值。如果我在代碼中手動輸入鍵,我能夠從字典中檢索值,但我無法讓它接受列表小部件中的值。以下是我嘗試使用的代碼:import sysfrom PySide2.QtGui import *from PySide2.QtCore import *from PySide2.QtWidgets import QLineEdit, QApplication, QMessageBox, QListWidgetfrom PySide2 import QtWidgetsitem_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變量在類中無法識別。
查看完整描述

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


查看完整回答
反對 回復 2022-08-25
  • 1 回答
  • 0 關注
  • 163 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號