Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Python: Разработка GUI > PyQt, передать с сигналом параметр


Автор: Hayate 4.9.2011, 18:18
В целях самообучения решил сделать калькулятор.
Код, помимо GUI:
Код
#-*- coding: utf-8 -*-
__author__ = 'Петров Егор'

from PyQt4 import QtCore, QtGui
import sys, calc_ui, string

app = QtGui.QApplication(sys.argv)
window = QtGui.QWidget()
ui = calc_ui.Ui_Dialog()
ui.setupUi(window)
window.show()


class Calculate:
    def __init__(self):
        self.result = 0

class DisplayLCD:
    def __init__(self):
        self.current = '0'
        ui.lcdNumber.display(self.current)
    def set_digit(self, digit):
        self.current = self.current + digit
        ui.lcdNumber.display(int(self.current))

Display = DisplayLCD()

QtCore.QObject.connect(ui.Button_1, QtCore.SIGNAL('clicked()'), Display.set_digit)

sys.exit(app.exec_())

Как сделать, чтобы set_digit(self, digit) получала параметр digit? 
Чтобы было 10 кнопок, 10 сигналов, 10 цифр.

Автор: Hayate 5.9.2011, 17:41
Вот такая загогулина, если в виде кода (Python 3.2):
http://narod.ru/disk/24083182001/calc.zip.html

Вот так вот передавать экмземпляру Display объекта DisplayLCD параметр parametr нельзя, а как можно?
QtCore.QObject.connect(ui.Button_1, QtCore.SIGNAL('clicked()'), Display.set_digit(parametr))

Автор: Amp 6.9.2011, 17:09
Используй QSignalMapper.

Автор: Filin86 28.5.2012, 06:18
Цитата

ui.Button_1, QtCore.SIGNAL('clicked()'), Display.set_digit
 

Сигнал clicked не имеет параметров, а слот требует параметра. 
Код

class DisplayLCD:
    def __init__(self):
        self.current = 0 # должно быть int для отображения, а не строка ('0')
        self.digit = 1
        ui.lcdNumber.display(self.current)
    def set_digit(self):
        self.current = self.current + self.digit
        ui.lcdNumber.display(int(self.current))
Display = DisplayLCD()
QtCore.QObject.connect(ui.Button_1, QtCore.SIGNAL('clicked()'), Display.set_digit) 
#ui.Button_1.clicked.connect(Display.set_digit) - это новым стилем, так как-то проще выглядит

Автор: vrny 5.6.2012, 10:29
Лямбдами. Можно в цикле создавать объект кнопки, лепить его в какой-нибудь лайоут и одновременно делать connect примерно такого вида:
QtCore.QObject.connect(ui.Button_1, QtCore.SIGNAL('clicked()'), lambda: Display.set_digit(i) ) 
где i - индекс цикла от 0 до 9

ui в дизайнере сделан? Тогда придётся написать 10 таких строчек smile . Хорошо, что кнопок не 1000 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)