Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » PyQt, передать с сигналом параметр [RSS Feed]

#1 Сен. 4, 2011 18:18:43

Hayate
От:
Зарегистрирован: 2010-10-15
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQt, передать с сигналом параметр

В целях самообучения решил сделать калькулятор.
Код, помимо 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 цифр.



Офлайн

#2 Сен. 4, 2011 19:37:17

plusplus
От:
Зарегистрирован: 2009-01-05
Сообщения: 418
Репутация: +  15  -
Профиль   Отправить e-mail  

PyQt, передать с сигналом параметр

Что-то я не разобрался в коде до конца если честно что он должен делать, попробую общие моменты написать, может поможет.
Надо как минимум наследовать от QObject класс который будет должен принимать или посылать сигналы.
И вот пример использования сигнала с параметром:

class mainForm(QWidget, Ui_mainForm):
"""
Class documentation goes here.
"""
def __init__(self, parent = None):
"""
Constructor
"""
QWidget.__init__(self, parent)
self.setupUi(self)
# Тут часть кода пропустил
self.connect(self.proxyCombo, SIGNAL("currentIndexChanged(int)"), self.changeProxy)
def changeProxy(self, index):
#print index
self.proxytype = index



Офлайн

#3 Сен. 4, 2011 20:40:56

Hayate
От:
Зарегистрирован: 2010-10-15
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQt, передать с сигналом параметр

Сумбур в голове враг всего…
Пытаюсь сделать, чтобы когда нажимаешь на цифру на клавиатуре калькулятора (которая нарисована в ку дезигнере), эта цифра появлялась на LCDNumber-е. А если нажимаешь вторую, то она добавлялась к первой… Код на работе остался. :(



Офлайн

#4 Сен. 5, 2011 10:12:52

Hayate
От:
Зарегистрирован: 2010-10-15
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQt, передать с сигналом параметр

Hayate
Сумбур в голове враг всего…
Пытаюсь сделать, чтобы когда нажимаешь на цифру на клавиатуре калькулятора (которая нарисована в ку дезигнере), эта цифра появлялась на LCDNumber-е. А если нажимаешь вторую, то она добавлялась к первой… Код на работе остался. :(
Вот полный “проект”. http://narod.ru/disk/24083182001/calc.zip.html
Что-то файлы не прикрепляются на форуме…
Щас ещё про сигналы почитаю.



Отредактировано (Сен. 5, 2011 13:20:15)

Офлайн

#5 Сен. 5, 2011 13:42:49

Hayate
От:
Зарегистрирован: 2010-10-15
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQt, передать с сигналом параметр

plusplus
Что-то я не разобрался в коде до конца если честно что он должен делать, попробую общие моменты написать, может поможет.
Надо как минимум наследовать от QObject класс который будет должен принимать или посылать сигналы.
И вот пример использования сигнала с параметром:
class mainForm(QWidget, Ui_mainForm):
"""
Class documentation goes here.
"""
def __init__(self, parent = None):
"""
Constructor
"""
QWidget.__init__(self, parent)
self.setupUi(self)
# Тут часть кода пропустил
self.connect(self.proxyCombo, SIGNAL("currentIndexChanged(int)"), self.changeProxy)
def changeProxy(self, index):
#print index
self.proxytype = index
Как я понял, метод changeProxy должен принять параметр, который затем присваивается атрибуту index, так вот как ему этот параметр передать?
self.connect(self.proxyCombo, SIGNAL("currentIndexChanged(int)"), self.changeProxy(parametr))
Вот так вот?



Офлайн

#6 Сен. 6, 2011 12:45:21

plusplus
От:
Зарегистрирован: 2009-01-05
Сообщения: 418
Репутация: +  15  -
Профиль   Отправить e-mail  

PyQt, передать с сигналом параметр

Hayate
plusplus
Что-то я не разобрался в коде до конца если честно что он должен делать, попробую общие моменты написать, может поможет.
Надо как минимум наследовать от QObject класс который будет должен принимать или посылать сигналы.
И вот пример использования сигнала с параметром:
class mainForm(QWidget, Ui_mainForm):
"""
Class documentation goes here.
"""
def __init__(self, parent = None):
"""
Constructor
"""
QWidget.__init__(self, parent)
self.setupUi(self)
# Тут часть кода пропустил
self.connect(self.proxyCombo, SIGNAL("currentIndexChanged(int)"), self.changeProxy)
def changeProxy(self, index):
#print index
self.proxytype = index
Как я понял, метод changeProxy должен принять параметр, который затем присваивается атрибуту index, так вот как ему этот параметр передать?
self.connect(self.proxyCombo, SIGNAL("currentIndexChanged(int)"), self.changeProxy(parametr))
Вот так вот?
У меня уже рабочий пример был, как только изменяется значение QComboBox, то он посылает сигнал с параметром - текущем индексом элемента. Вот к нему коннектим наш слот changeProxy и в нём имеем это значение индекса. У меня был приведен точно рабочий пример, а что у тебя будет я не знаю, возможно интерпретатор выдаст ошибку.



Офлайн

#7 Сен. 7, 2011 02:01:08

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2759
Репутация: +  184  -
Профиль   Отправить e-mail  

PyQt, передать с сигналом параметр

#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys, string
from calc_ui import *

class Calc(QtGui.QDialog, Ui_Dialog):
def __init__(self):
QtGui.QDialog.__init__(self)
self.setupUi(self)
QtCore.QObject.connect(self.Button_1, QtCore.SIGNAL('clicked()'), lambda: self.set_digit("1"))
QtCore.QObject.connect(self.Button_2, QtCore.SIGNAL('clicked()'), lambda: self.set_digit("2"))

def set_digit(self, value):
if not self.lcdNumber.intValue() == 0: self.lcdNumber.setProperty("value",QtCore.QVariant(float(str(self.lcdNumber.intValue())+value)))
else: self.lcdNumber.setProperty("value",QtCore.QVariant(float(value)))


app = QtGui.QApplication(sys.argv)
window = Calc()
window.show()
sys.exit(app.exec_())



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано (Сен. 7, 2011 03:47:53)

Офлайн

#8 Сен. 8, 2011 06:37:11

Hayate
От:
Зарегистрирован: 2010-10-15
Сообщения: 34
Репутация: +  1  -
Профиль   Отправить e-mail  

PyQt, передать с сигналом параметр

Rodegast
if not self.lcdNumber.intValue() == 0: self.lcdNumber.setProperty("value",float(str(self.lcdNumber.intValue())+value))
Спасибо, про лямбду нашёл, почитал, понял.
А вот в куске выше, есть какой-то особый смысл писать именно так, а не простой if и != ?



Офлайн

#9 Сен. 9, 2011 00:09:14

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2759
Репутация: +  184  -
Профиль   Отправить e-mail  

PyQt, передать с сигналом параметр

Пиши как тебе нравится. Можешь даже так:

if self.lcdNumber.intValue():



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

  • Начало
  • » GUI
  • » PyQt, передать с сигналом параметр[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version