Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 13, 2009 20:33:49

MaoDzeDun
От:
Зарегистрирован: 2009-09-20
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQT QtCore.QObject.connect

Здравствуйте, господа!
Делаю на pyqt экранную клавиатуру, которая состоит из 10 цифр. Вся клавиатура - это 10 QPushButton-ов.
Дабы это все заработало, делаю такие связи сигнал-слот
QtCore.QObject.connect(self.ui.button1,QtCore.SIGNAL(“clicked()”), self.addDigit1)
QtCore.QObject.connect(self.ui.button2,QtCore.SIGNAL(“clicked()”), self.addDigit2)
QtCore.QObject.connect(self.ui.button3,QtCore.SIGNAL(“clicked()”), self.addDigit3)
QtCore.QObject.connect(self.ui.button4,QtCore.SIGNAL(“clicked()”), self.addDigit4)
QtCore.QObject.connect(self.ui.button5,QtCore.SIGNAL(“clicked()”), self.addDigit5)
QtCore.QObject.connect(self.ui.button6,QtCore.SIGNAL(“clicked()”), self.addDigit6)
QtCore.QObject.connect(self.ui.button7,QtCore.SIGNAL(“clicked()”), self.addDigit7)
QtCore.QObject.connect(self.ui.button8,QtCore.SIGNAL(“clicked()”), self.addDigit8)
QtCore.QObject.connect(self.ui.button9,QtCore.SIGNAL(“clicked()”), self.addDigit9)
QtCore.QObject.connect(self.ui.button0,QtCore.SIGNAL(“clicked()”), self.addDigit0)

Уже некрасиво выглядит, но дальше еще хуже. 10 раз объявляю функции addDigit. Например:

def addDigit4(self):
self.addOverallDigit(4)

def addDigit8(self):
self.addOverallDigit(8)

И уже только в функции addOverallDigit я могу полученный символ добавить в итоговую переменную. Весь этот ужас из-за того, что при связи сигналов и слотов, я не могу сделать запись вида:

QtCore.QObject.connect(self.ui.button9,QtCore.SIGNAL(“clicked()”), self.addOverallDigit(9))
QtCore.QObject.connect(self.ui.button9,QtCore.SIGNAL(“clicked()”), self.addOverallDigit(0))

И приходится вводить переходные функции.
Есть ли какое-то более изящное решение?
Заранее благодарен!



Офлайн

#2 Дек. 13, 2009 20:52:06

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

PyQT QtCore.QObject.connect

Используй QButtonGroup, а в нем QPushButton-ы.
Сигнал будет buttonClicked(int), в твоем случае сможешь использовать self.addOverallDigit(int)



Офлайн

#3 Дек. 14, 2009 00:08:51

MaoDzeDun
От:
Зарегистрирован: 2009-09-20
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQT QtCore.QObject.connect

SnowWolf, большое спасибо!
Помогло
на будущее если кому понадобится
#создаем QButtonGroup
self.bGroup=QtGui.QButtonGroup(self.MainStackAdminServicesW)

#создаем кнопку
self.Service1ActionB = QtGui.QPushButton(self.MainStackAdminServicesW)
self.Service1ActionB.setGeometry(QtCore.QRect(620, 30, 300, 80))
self.Service1ActionB.setObjectName(“Service1ActionB”)

#добавляем кнопку в QButtonGroup
self.bGroup.addButton(self.Service1ActionB)

#присваем ей айди 0
self.bGroup.setId(self.Service1ActionB, 0)

#создаем кнопку
self.Service2ActionB = QtGui.QPushButton(self.MainStackAdminServicesW)
self.Service2ActionB.setGeometry(QtCore.QRect(620, 130, 300, 80))
self.Service2ActionB.setObjectName(“Service2ActionB”)

#добавляем кнопку в QButtonGroup
self.bGroup.addButton(self.Service2ActionB)

#присваем ей айди 1
self.bGroup.setId(self.Service2ActionB,1)



Далее связываем сигнал
QtCore.QObject.connect(self.ui.bGroup,QtCore.SIGNAL(“buttonClicked(int)”), self.func)

А вот сама функция func
def func(self, var):
print var

При нажатии на кнопку Service1ActionB var будет равна 0, при нажатии на Service2ActionB - единице и т.д.



Офлайн

#4 Дек. 14, 2009 20:46:58

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

PyQT QtCore.QObject.connect

MaoDzeDun
#добавляем кнопку в QButtonGroup
self.bGroup.addButton(self.Service1ActionB)

#присваем ей айди 0
self.bGroup.setId(self.Service1ActionB, 0)
Можно сразу и добавить и присвоить ид
self.bGroup.addButton(self.Service1ActionB, 0)



Офлайн

#5 Дек. 23, 2009 20:39:53

topazz
От:
Зарегистрирован: 2008-09-12
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQT QtCore.QObject.connect

Похожий затык возник.

Собираю группу из чекбоксов, на основании словаря


#В словаре

self.topics = {'astronomy':['Астрономия', 1], 'geology':['Геология', 0], 'gyroscope':['Гироскопия', 0],
'literature':['Литература', 0], 'marketing':['Маркетинг', 0], 'mathematics':['Математика', 1],
'music':['Музыка', 0], 'polit':['Политика', 0], 'agrobiologia':['Почвоведение', 0],
'law':['Правоведение', 0], 'psychology':['Психология', 0], 'geography':['География', 0],
'physics':['Физика', 0], 'chemistry':['Химия', 0], 'estetica':['Эстетика', 1]}

#Собираю


topicsLayout = QtGui.QVBoxLayout()
for x in self.topics.keys():
chek = QtGui.QCheckBox(self.trUtf8(self.setting.topics[x][0]))
if self.setting.topics[x][1]:
chek.setChecked(True)
topicsLayout.addWidget(chek)
Но все не так получается.
Не могу понять как обращаться к каждому соданному чекбоксу.
И не понятно как сделать так что бы , изменение статуса чекбокса обрабатывалось функцией которая, в свою очередь вносила бы изменения в исходный словарь.

Грубо говоря, если чекбокс с лейблом Астрономия, изменил свое состояние, то значение ключа astronomy в ловаре должно измениться на

В голове каша, помогите.



Отредактировано (Дек. 23, 2009 20:40:42)

Офлайн

#6 Дек. 23, 2009 22:09:00

topazz
От:
Зарегистрирован: 2008-09-12
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQT QtCore.QObject.connect

Кажись разобрался но как мне кажется это грабли. Есть ли более гуманный сособ решить задачу?

В словаре

self.setting.topics = {'astronomy':['Астрономия', 1], 'geology':['Геология', 0], 'gyroscope':['Гироскопия', 0], 
'literature':['Литература', 0], 'marketing':['Маркетинг', 0], 'mathematics':['Математика', 1],
'music':['Музыка', 0], 'polit':['Политика', 0], 'agrobiologia':['Почвоведение', 0],
'law':['Правоведение', 0], 'psychology':['Психология', 0], 'geography':['География', 0],
'physics':['Физика', 0], 'chemistry':['Химия', 0], 'estetica':['Эстетика', 1]}
Собираем
    def createTopicsBox(self):
self.topicsGroupBox = QtGui.QGroupBox(self.trUtf8("Темы"))
topicsLayout = QtGui.QVBoxLayout()
for x in self.setting.topics.keys():
topek = QtGui.QCheckBox(self.trUtf8(self.setting.topics[x][0]))
if self.setting.topics[x][1]:
topek.setChecked(True)
topicsLayout.addWidget(topek)
self.connect(topek, QtCore.SIGNAL('toggled(bool)'), self.updateTopicsBox)
self.topicsGroupBox.setLayout(topicsLayout)
Функция
    def updateTopicsBox(self):
sender = self.sender()
txt = sender.text()
status = sender.checkState()
print sender, txt, status
for x in self.setting.topics.keys():
if self.setting.topics[x][0] == str(txt):
if status:
self.setting.topics[x][1] = 1
else:
self.setting.topics[x][1] = 0



Офлайн

#7 Дек. 23, 2009 23:02:22

truporez
От:
Зарегистрирован: 2009-05-08
Сообщения: 266
Репутация: +  6  -
Профиль   Адрес электронной почты  

PyQT QtCore.QObject.connect

Мысли вслух: А может лучше унаследовать от QCheckBox добавив нужные тебе атрибуты и методы?



Офлайн

#8 Дек. 24, 2009 07:46:20

topazz
От:
Зарегистрирован: 2008-09-12
Сообщения: 56
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQT QtCore.QObject.connect

Блин, мой пример работает только в Эклипсе.

Как только его собираю в Exe, сразу начинает орать на кодировку в

if self.setting.topics[x][0] == str(txt):
Орет так

Traceback (most recent call last):
File "maingui.py", line 185, in updateTopicsBox
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd0 in position 0: ordinal not in range(128)
Я конечно понимаю, что там русский язык, но в какую сторону его декодить не пойму.

Установил chardet. В функции
    def updateTopicsBox(self):
txt = self.sender().text()
status = self.sender().checkState()
for x in self.setting.topics.keys():
print chardet.detect(self.setting.topics[x][0])
print chardet.detect(str(txt)) #на эту строку ругается при сборке в exe
если определить chardet кодировку двух строк то получается что обе
{'confidence': 0.98999999999999999, 'encoding': 'utf-8'}
{'confidence': 0.98999999999999999, 'encoding': 'utf-8'}
Так какого хрена ругается на вторую не понимаю :mad:


UPD.
Решено
    def updateTopicsBox(self):
txt = unicode(self.sender().text()).encode('utf-8') #ХЗ почему
status = self.sender().checkState()
for x in self.setting.topics.keys():
print chardet.detect(self.setting.topics[x][0])
print chardet.detect(str(txt))
Получается что эклипс как-то иначе работает…. брррр.. ушел думать



Отредактировано (Дек. 24, 2009 10:18:27)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version