Уведомления

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

#1 Сен. 24, 2011 02:33:36

vovane
От:
Зарегистрирован: 2011-09-24
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Как игнорировать аргументы сигнала PyQt?

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,когда пытался почти наугад куда-нибудь его воткнуть,но разобраться обратно уже не могу.И никак не пойму,в чем проблема,потому,собственно,сюда и пишу.Подскажите новичку,пожалуйста:)



Офлайн

#2 Сен. 24, 2011 07:19:57

dartNNN
От:
Зарегистрирован: 2009-12-08
Сообщения: 199
Репутация: +  0  -
Профиль   Отправить e-mail  

Как игнорировать аргументы сигнала PyQt?

Старый стиль подключения сигналов
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”))



Офлайн

#3 Сен. 24, 2011 15:01:43

vovane
От:
Зарегистрирован: 2011-09-24
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Как игнорировать аргументы сигнала PyQt?

Большое спасибо!Однако,возникает другой вопрос - если мне все-таки нужен тот аргунмент,который передает сигнал,как его принять?:)



Офлайн

#4 Сен. 25, 2011 07:11:07

dartNNN
От:
Зарегистрирован: 2009-12-08
Сообщения: 199
Репутация: +  0  -
Профиль   Отправить e-mail  

Как игнорировать аргументы сигнала PyQt?

Тогда надо, чтобы слот принимал этот параметр. Т.е. для случая с 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



Офлайн

#5 Сен. 25, 2011 16:56:34

vovane
От:
Зарегистрирован: 2011-09-24
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Как игнорировать аргументы сигнала PyQt?

Большое спасибо! Я,получается,писал по устаревшей книге? Буду искать поновее. Кстати,в местном каталоге есть такие книги? Мне на глаза не попалось, я уже просмотрел.



Офлайн

#6 Сен. 26, 2011 12:04:03

dartNNN
От:
Зарегистрирован: 2009-12-08
Сообщения: 199
Репутация: +  0  -
Профиль   Отправить e-mail  

Как игнорировать аргументы сигнала PyQt?

Вот тут ничем помочь не могу( Я ничем кроме документации никогд не пользовался



Офлайн

#7 Сен. 26, 2011 12:43:15

vovane
От:
Зарегистрирован: 2011-09-24
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Как игнорировать аргументы сигнала PyQt?

Ясно.В любом случае,большое спасибо за помощь.Я тут на форуме новичок,нигде нельзя плюсик в репу поставить или что-нибудь в этом роде сделать?:)



Офлайн

  • Начало
  • » GUI
  • » Как игнорировать аргументы сигнала PyQt?[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version