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(())
Я надеюсь, что это последнее изменение должно сработать, но я не могу проверить это прямо сейчас, так как я печатаю на своем телефоне;)