Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » PyQt4. Создание меню "последние файлы" [RSS Feed]

#1 Май 25, 2009 22:58:49

Moonbite2006
От:
Зарегистрирован: 2008-07-04
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4. Создание меню "последние файлы"

Всем добрый вечер (или уже ночь). Собственно говоря сабж:) Меню аналогичное “последние документы” в блокноте или в офисе. Попробовал сделать через файл истории, куда заносится путь от любого открытого от куда то, или сохраненного куда то файла. Потом читается этот файл на предмет путей к файлам и генерирует меню. Как теперь выдать на каждое подобное подменю (включающее путь к одному из файлов) свой слот?

фунция генерирующая меню и раздающая сигналы и слоты

def RecentFileAction(self):
if os.path.exists('history')==True:
history=open('history','r')
for i in history.readlines():
self.path=os.path.split(i)
tempFileName=str(self.path[1]).replace('\n','')
temp=self.RecentFiles.addAction(tempFileName)
self.connect(temp,QtCore.SIGNAL('triggered()'),self.openDoc)
self.RecentFiles.addSeparator()
self.clearHistory=self.RecentFiles.addAction(u'Очистить историю')
self.connect(self.clearHistory,QtCore.SIGNAL('triggered()'),self.DelHistory)
else:
self.RecentFiles.clear()
Слот открывания файлов и переброс их в виджет редактирования self.inputText
path=os.path.join(self.path[0],self.path[1])
path=path.replace('\n','')
if os.path.exists(path)==True:
OpenFile=open(path,'r')
temp=''.join(OpenFile.read())
self.inputText.setText(temp)
self.filename=path
self.setWindowTitle(self.filename)
добавить в слот и переменную которую требуется передать функции мне не дает интерпритатор и всячески орет касательно не правильного 3его аргумента в self.connect. Судя по всему я не правильно его об этом прошу. Подскажите, чем тут можно реализовать данный аспект, ну или ссылкой на документацию, если это реализовывается другими средствами.



Офлайн

#2 Май 26, 2009 07:54:24

poltergeist
От:
Зарегистрирован: 2007-02-28
Сообщения: 522
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4. Создание меню "последние файлы"

Я так понимаю, тебе нужно вместе с сигналом передать в обработчик (слот) дополнительные данные (путь). Для этого можно записать данные в Action:
temp.setData(QtCore.QVariant(path)). Чтобы понять, какой Action вызвал обработчик, есть функция self.sender().

action = self.sender()
path = action.data().toString()
...



Офлайн

#3 Май 26, 2009 08:45:23

Moonbite2006
От:
Зарегистрирован: 2008-07-04
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4. Создание меню "последние файлы"

poltergeist
Я так понимаю, тебе нужно вместе с сигналом передать в обработчик (слот) дополнительные данные (путь). Для этого можно записать данные в Action:
temp.setData(QtCore.QVariant(path)). Чтобы понять, какой Action вызвал обработчик, есть функция self.sender().
action = self.sender()
path = action.data().toString()
...
Спасибо, но можно по-подробнее? Потом action надо записывать на месте слота?) Часто видел в примерах кода QVariant , для чего он преднозначен так и не понял…



Офлайн

#4 Май 26, 2009 08:49:08

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

PyQt4. Создание меню "последние файлы"

Не люблю использовать QObject.sender. Это не красиво и не понятно. А если несколько сигналов а этот слот из разных нитей? Вернее даже не на слот, а на объект. Не… Как-то это не так…

self.connect(act, QtCose.SIGNAL('triggered()'), lambda : obj.slot(par) )
Вот и всё. При возбуждении сигнала 'triggered()' у act, будет вызвана эта лямбда, которая вызовет obj.slot с параметром par. И пусть все вопят, что в питоне лямбда покоцанная… Но она же работает!



Офлайн

#5 Май 26, 2009 09:09:18

Moonbite2006
От:
Зарегистрирован: 2008-07-04
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4. Создание меню "последние файлы"

Через лямбду не выходит. Он всем пунктам меню выдает одинаковый слот для отрывания одного и того же файла (а именно последнего в списке)

Хотя это логично, ибо переменная в цикле затирается на последнее значение, следовательно слоту передается именно это значение… Щас подумаю, как можно этого избежать…



Отредактировано (Май 26, 2009 09:20:53)

Офлайн

#6 Май 26, 2009 09:24:11

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

PyQt4. Создание меню "последние файлы"

:-) Ничего не “затирается”.
Вот тебе более разжёванный подход.

self.connect(act, QtCose.SIGNAL('triggered()'), lambda par=par: obj.slot(par) )



Офлайн

#7 Май 26, 2009 09:45:02

Moonbite2006
От:
Зарегистрирован: 2008-07-04
Сообщения: 26
Репутация: +  0  -
Профиль   Отправить e-mail  

PyQt4. Создание меню "последние файлы"

ZZZ
:-) Ничего не “затирается”.
Вот тебе более разжёванный подход.
self.connect(act, QtCose.SIGNAL('triggered()'), lambda par=par: obj.slot(par) )
Емое, получилось) Спасибо большое =) Никогда лябду не использовал (как выяснилось зря), поэтому до сих пор не очень понимаю, что же здесь произошло) Ща чего-нибудь почитаю на эту тему…



Офлайн

  • Начало
  • » GUI
  • » PyQt4. Создание меню "последние файлы"[RSS Feed]

Board footer

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

Powered by DjangoBB

Lo-Fi Version