Форум сайта python.su
PyQt 4.8.5,Python 2.7. Нашел в книге “Rapid GUI Programming with PyQt” простенький пример с сигналами и слотами,и на основе его решил попробовать написать свою маленькую прогу для,так сказать,усвоения материала.Идея была в том, чтобы два сигнала valueChanged(int) от QDial и QSpinbox привязать к одной функции,которая будет менять значение одного из элементов на значение поменявшегося и писать при этом в консоль.Вот код:
import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *
class Form(QWidget):
def __init__(self,parent=None):
super(Form,self).__init__(parent)
self.dial=QDial()
self.dial.setNotchesVisible(True)
self.dial.setRange(0,1000)
self.spinbox=QSpinBox()
self.spinbox.setRange(0,1000)
layout=QVBoxLayout()
layout.addWidget(self.dial)
layout.addWidget(self.spinbox)
self.setLayout(layout)
self.connect(self.dial, SIGNAL("valueChanged"), lambda:self.changeValue("dial"))
self.connect(self.spinbox, SIGNAL("valueChanged"), lambda:self.changeValue("spinbox"))
self.setWindowTitle("Signals and slots")
def changeValue(self,author):
print self.spinbox.value(),self.dial.value()
if author == "spinbox":
self.dial.setValue(self.spinbox.value())
elif author == "dial":
self.spinbox.setValue(self.dial.value())
app=QApplication(sys.argv)
form=Form()
form.show()
app.exec_()
Офлайн
Старый стиль подключения сигналов
self.connect(self.dial, SIGNAL(“valueChanged”), lambda:self.changeValue(“dial”))
self.connect(self.spinbox, SIGNAL(“valueChanged”), lambda:self.changeValue(“spinbox”))
Новый стиль (начиная с PyQt 4.7 кажется)
self.dial.valueChanged.connect(lambda:self.changeValue(“dial”))
self.spinbox.valueChanged.connect(lambda:self.changeValue(“spinbox”))
Офлайн
Большое спасибо!Однако,возникает другой вопрос - если мне все-таки нужен тот аргунмент,который передает сигнал,как его принять?:)
Офлайн
Тогда надо, чтобы слот принимал этот параметр. Т.е. для случая с lambda
self.dial.valueChanged.connect(lambda x:self.changeValue("dial",x))
self.spinbox.valueChanged.connect(lambda x:self.changeValue("spinbox",x))
self.setWindowTitle("Signals and slots")
def changeValue(self,author, value):
print(value)
self.dial.valueChanged.connect(self.func)
def func(self, value):
pass
Офлайн
Большое спасибо! Я,получается,писал по устаревшей книге? Буду искать поновее. Кстати,в местном каталоге есть такие книги? Мне на глаза не попалось, я уже просмотрел.
Офлайн
Вот тут ничем помочь не могу( Я ничем кроме документации никогд не пользовался
Офлайн
Ясно.В любом случае,большое спасибо за помощь.Я тут на форуме новичок,нигде нельзя плюсик в репу поставить или что-нибудь в этом роде сделать?:)
Офлайн