如何在PyQt上使用findChild来访问方法中的小部件?

时间:2016-01-01 05:13:51

标签: python pyqt5

我是PyQt的新手,我正在进行像应用程序这样的小聊天。我初始化了GUI并创建了几种管理用户输入的方法。问题是,我无法使用self.Method()指令,如网上教程所示。出于某种原因,Python告诉我对象没有属性' WIDGET' 其中WIDGET在这种情况下是QListWidget。

我设法使用findChild克服了这一点,但我不确定这是否正确。从PyQt上的方法中访问小部件的正确方法是什么?

这是我的代码:

import stuff *
class ASIMOV(QWidget):
        def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        QToolTip.setFont(QFont('SansSerif', 12))

        botLog = QListWidget(self)
        botLog.resize(150, 150)

        botInput = QLineEdit(self)
        botInput.returnPressed.connect(self.handleChatInput)

        vbox = QVBoxLayout()
        vbox.addWidget(botLog)
        vbox.addWidget(botInput)

        self.setLayout(vbox)
        self.resize(600, 400)
        self.show()

    def startChat(self, botLog):
        u = ASIMOV_user.User()
        #Greet user
        botLog.addItem('#: Hey there' + u.getName())
        botChat = ASIMOV_chat.Chat()

    def handleChatInput(self):
        u = ASIMOV_user.User()
        print(self.botLog.text())
        botInput = self.findChild(QLineEdit, "")
        botLog = self.findChild(QListWidget, "")
        #lineEdits = self.findChildren(QLineEdit)
        botLog.addItem('#' + u.getName() + ': ' + botInput.text())
        #print(botInput.text())

if __name__=="__main__":
    app = QApplication(sys.argv)
    w = ASIMOV()
    sys.exit(app.exec_())

另外,每次我想访问他们的方法时,我是否必须初始化一个类,例如来自ASIMOV_user类的getter?

1 个答案:

答案 0 :(得分:1)

three_pineapples给出的答案。在这种情况下,原始代码具有声明的小部件,而不使用self运算符,这使得它们成为局部元素。

正如他所描述的,它只需要添加self.WIDGET以使它们可用于应用程序中的其余方法。

原始答案:

  

通过制作小部件来存储对小部件的引用   实例属性(例如self.botInput = QLineEdit(self))。然后你可以   从你的任何方法以相同的方式(self.botInput)访问它们   类。我建议运行一些关于对象的基本教程   使用Python进行面向编程以熟悉这些概念   您需要成功编写GUI程序