【问题标题】:Python: Connect QlineEdit with QlcdNumber via buttonPython:通过按钮将 QlineEdit 与 QlcdNumber 连接起来
【发布时间】:2016-03-15 11:08:17
【问题描述】:

为什么编辑框的内容没有传入lcdNumber字段?

class MainDialog (QDialog, MultiTool_widget_ui.Ui_Form):
    def __init__(self):
        #super(MainDialog, self).__init__() OR <next line>
        QDialog.__init__(self)
        self.setupUi(self)
        self.connect(self.pushButton, SIGNAL("clicked()"),self.lcdNumber.display(self.lineEdit.text()))    

【问题讨论】:

    标签: python pyside qlineedit qlcdnumber


    【解决方案1】:

    信号必须连接到一个可调用对象。但在你的例子中:

        self.connect(self.pushButton, SIGNAL("clicked()"),
            self.lcdNumber.display(self.lineEdit.text()))
    

    您实际上是在传递display() 方法的返回值,在本例中为None

    要修复您的示例,您可以使用 lambda 函数,如下所示:

        self.pushButton.clicked.connect(
            lambda: self.lcdNumber.display(self.lineEdit.text()))
    

    现在你传入一个函数对象,它会在信号被触发时被调用。

    【讨论】:

    • 谢谢。有趣的!这也适用于教程中的语法:self.pushButton.clicked.connect(lambda: self.lcdNumber.display(self.lineEdit.text()))
    【解决方案2】:

    您连接槽和信号的方式是您在 C++ 中的方式,与在 pyside 中的方式不同。

    Zetcode 的一篇文章中,有这个确切程序的示例代码:

    import sys
    from PySide import QtGui, QtCore
    
    class Example(QtGui.QWidget):
    
    def __init__(self):
        super(Example, self).__init__()
    
        self.initUI()
    
    def initUI(self):
    
        lcd = QtGui.QLCDNumber(self)
        sld = QtGui.QSlider(QtCore.Qt.Horizontal, self)
    
        vbox = QtGui.QVBoxLayout()
        vbox.addWidget(lcd)
        vbox.addWidget(sld)
    
        self.setLayout(vbox)
        sld.valueChanged.connect(lcd.display)
    
        self.setGeometry(300, 300, 250, 150)
        self.setWindowTitle('Signal & slot')
        self.show()
    
    def main():   
       app = QtGui.QApplication(sys.argv)
       ex = Example()
       sys.exit(app.exec_())
    
    
    if __name__ == '__main__':
        main()
    

    这不仅显示了应该如何编写整个程序(我假设这是您的目标),还显示了您在 PySide 中连接信号和插槽的方式。

    所以而不是 C++ 方式:

    self.connect(self.pushButton, SIGNAL("clicked()"),self.lcdNumber.display(self.lineEdit.text()))
    

    你应该有:

    sld.valueChanged.connect(lcd.display)
    

    或者在你的情况下:

    sld.valueChanged.connect(self.lineEdit.setText()) 
    

    还要注意我写了“setText()”而不是“text()”,因为“text()”返回当前文本,“setText()”改变了它。

    重新阅读问题后,这里是可以使它工作的 sn-p:

    class MainDialog (QDialog, MultiTool_widget_ui.Ui_Form):
        def __init__(self):
            #super(MainDialog, self).__init__() OR <next line>
            QDialog.__init__(self)
            self.setupUi(self)
    
            self.btn = QPushButton("Click ME!")
            self.le = QLineEdit(self)
            self.lcd = QLCDDisplay(self)
    
            btn.clicked.connect(self.onBtnClicked)
    
            vbox = QVBoxLayout(self)
            vbox.addWidget(self.btn)
            vbox.addWidget(self.le)
            vbox.addWidget(self.lcd)
            self.setLayout(vbox)
    
        def onBtnClicked():
            self.lcd.display(self.le.text(())
    

    我希望最后一次编辑可以解决问题,但是我现在无法测试这个,因为我正在手机上打字;)

    【讨论】:

    • 我明白了。我之前用 C++ 编写过一些代码,然后才开始阅读教程。但我想知道如何通过按下该按钮来连接这两个对象的内容。该操作的语法如何?
    • 所以如果我理解正确的话,你想要一个按钮、一个显示和一个行编辑。当单击按钮时,您希望 lineedits 值显示在显示屏上吗?
    • 是的!我认为这从我的初始代码 sn-p 中很清楚 :)
    • 不,这不是真的。我现在在工作,我会在 1 小时后在回家的路上输入一些东西 :)
    • @Creatronik 更新了我的问题。
    猜你喜欢
    • 2020-10-13
    • 2021-12-08
    • 2019-09-01
    • 2017-06-03
    • 2023-03-25
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多