Python: соедините QlineEdit с QlcdNumber с помощью кнопки

Почему содержимое поля редактирования не переносится в поле 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()))    

2 ответа

Решение

Сигналы должны быть связаны с вызываемым объектом. Но в вашем примере:

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

Теперь вы передаете функциональный объект, который будет вызываться при срабатывании сигнала.

То, как вы соединили слот и сигнал, это то же самое, что вы сделали бы это в C++, но это не то же самое, что в pyside.

В articel на 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()" меняет его.

Перечитав вопрос, вот фрагмент кода, который заставит его работать:

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

Я надеюсь, что это последнее изменение должно сработать, но я не могу проверить это прямо сейчас, так как я печатаю на своем телефоне;)

Другие вопросы по тегам