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

фунция генерирующая меню и раздающая сигналы и слоты
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. Судя по всему я не правильно его об этом прошу. Подскажите, чем тут можно реализовать данный аспект, ну или ссылкой на документацию, если это реализовывается другими средствами.
poltergeist
Я так понимаю, тебе нужно вместе с сигналом передать в обработчик (слот) дополнительные данные (путь). Для этого можно записать данные в Action:
temp.setData(QtCore.QVariant(path)). Чтобы понять, какой Action вызвал обработчик, есть функция self.sender().
action = self.sender()
path = action.data().toString()
...
Moonbite2006
poltergeist
Я так понимаю, тебе нужно вместе с сигналом передать в обработчик (слот) дополнительные данные (путь). Для этого можно записать данные в Action:
temp.setData(QtCore.QVariant(path)). Чтобы понять, какой Action вызвал обработчик, есть функция self.sender().
action = self.sender()
path = action.data().toString()
...
Спасибо, но можно по-подробнее? Потом action надо записывать на месте слота?) Часто видел в примерах кода QVariant , для чего он преднозначен так и не понял…
ZZZ
Не люблю использовать QObject.sender. Это не красиво и не понятно. А если несколько сигналов а этот слот из разных нитей? Вернее даже не на слот, а на объект. Не… Как-то это не так…

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

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