Форум сайта python.su
Здравствуйте, господа!
Делаю на 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))
…
И приходится вводить переходные функции.
Есть ли какое-то более изящное решение?
Заранее благодарен!
Офлайн
Используй QButtonGroup, а в нем QPushButton-ы.
Сигнал будет buttonClicked(int), в твоем случае сможешь использовать self.addOverallDigit(int)
Офлайн
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 - единице и т.д.
Офлайн
MaoDzeDunМожно сразу и добавить и присвоить ид
#добавляем кнопку в QButtonGroup
self.bGroup.addButton(self.Service1ActionB)
#присваем ей айди 0
self.bGroup.setId(self.Service1ActionB, 0)
Офлайн
Похожий затык возник.
Собираю группу из чекбоксов, на основании словаря
#В словаре
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)
Отредактировано (Дек. 23, 2009 20:40:42)
Офлайн
Кажись разобрался но как мне кажется это грабли. Есть ли более гуманный сособ решить задачу?
В словаре
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
Офлайн
Мысли вслух: А может лучше унаследовать от QCheckBox добавив нужные тебе атрибуты и методы?
Офлайн
Блин, мой пример работает только в Эклипсе.
Как только его собираю в 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)
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
{'confidence': 0.98999999999999999, 'encoding': 'utf-8'}
{'confidence': 0.98999999999999999, 'encoding': 'utf-8'}
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)
Офлайн