Форум сайта python.su
Всем добрый вечер (или уже ночь). Собственно говоря сабж:) Меню аналогичное “последние документы” в блокноте или в офисе. Попробовал сделать через файл истории, куда заносится путь от любого открытого от куда то, или сохраненного куда то файла. Потом читается этот файл на предмет путей к файлам и генерирует меню. Как теперь выдать на каждое подобное подменю (включающее путь к одному из файлов) свой слот?
фунция генерирующая меню и раздающая сигналы и слоты
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()
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)
Офлайн
Я так понимаю, тебе нужно вместе с сигналом передать в обработчик (слот) дополнительные данные (путь). Для этого можно записать данные в Action:
temp.setData(QtCore.QVariant(path)). Чтобы понять, какой Action вызвал обработчик, есть функция self.sender().
action = self.sender()
path = action.data().toString()
...
Офлайн
poltergeistСпасибо, но можно по-подробнее? Потом action надо записывать на месте слота?) Часто видел в примерах кода QVariant , для чего он преднозначен так и не понял…
Я так понимаю, тебе нужно вместе с сигналом передать в обработчик (слот) дополнительные данные (путь). Для этого можно записать данные в Action:
temp.setData(QtCore.QVariant(path)). Чтобы понять, какой Action вызвал обработчик, есть функция self.sender().action = self.sender()
path = action.data().toString()
...
Офлайн
Не люблю использовать QObject.sender. Это не красиво и не понятно. А если несколько сигналов а этот слот из разных нитей? Вернее даже не на слот, а на объект. Не… Как-то это не так…
self.connect(act, QtCose.SIGNAL('triggered()'), lambda : obj.slot(par) )
Офлайн
Через лямбду не выходит. Он всем пунктам меню выдает одинаковый слот для отрывания одного и того же файла (а именно последнего в списке)
Хотя это логично, ибо переменная в цикле затирается на последнее значение, следовательно слоту передается именно это значение… Щас подумаю, как можно этого избежать…
Отредактировано (Май 26, 2009 09:20:53)
Офлайн
:-) Ничего не “затирается”.
Вот тебе более разжёванный подход.
self.connect(act, QtCose.SIGNAL('triggered()'), lambda par=par: obj.slot(par) )
Офлайн
ZZZЕмое, получилось) Спасибо большое =) Никогда лябду не использовал (как выяснилось зря), поэтому до сих пор не очень понимаю, что же здесь произошло) Ща чего-нибудь почитаю на эту тему…
:-) Ничего не “затирается”.
Вот тебе более разжёванный подход.self.connect(act, QtCose.SIGNAL('triggered()'), lambda par=par: obj.slot(par) )
Офлайн