Найти - Пользователи
Полная версия: Как игнорировать аргументы сигнала PyQt?
Начало » GUI » Как игнорировать аргументы сигнала PyQt?
1
vovane
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_()
Однако же,при запуске ничего не происходит,я вижу форму,могу покрутить QDial и пощелкать QSpinbox,но при этом мой слот как будто не вызывается.Причем так происходит,только если я напишу имена сигналов без аргументов,т.е. valueChanged или valueChanged(),если написать valueChanged(int) то исправно передается значение элемента формы,которое мне не нужно,и от которого я и пытаюсь избавиться,так как проверяю его в своем слоте.Я уже там конечно накосячил много с self,когда пытался почти наугад куда-нибудь его воткнуть,но разобраться обратно уже не могу.И никак не пойму,в чем проблема,потому,собственно,сюда и пишу.Подскажите новичку,пожалуйста:)
dartNNN
Старый стиль подключения сигналов
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”))
vovane
Большое спасибо!Однако,возникает другой вопрос - если мне все-таки нужен тот аргунмент,который передает сигнал,как его принять?:)
dartNNN
Тогда надо, чтобы слот принимал этот параметр. Т.е. для случая с 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
vovane
Большое спасибо! Я,получается,писал по устаревшей книге? Буду искать поновее. Кстати,в местном каталоге есть такие книги? Мне на глаза не попалось, я уже просмотрел.
dartNNN
Вот тут ничем помочь не могу( Я ничем кроме документации никогд не пользовался
vovane
Ясно.В любом случае,большое спасибо за помощь.Я тут на форуме новичок,нигде нельзя плюсик в репу поставить или что-нибудь в этом роде сделать?:)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB