Форум сайта python.su
dartNNN, спасибо за науку!
ранее пробовал достать через index.row и index.data, повидимому что-то не так использовал, потому что у меня не получилось, жаль что код ошибочных попыток не сохранил, не пойму где косячил
кста, под ВиндаЗ и без этого фурычит:
import sip
sip.setapi('QVariant', 1)
Офлайн
GinibeУ меня python 3.1, PyQt 4.8.2 и по-умолчанию используется вторая версия PyQt Api, где QVariant не создается, отсутствует QString и еще кое-чего по-другому. Поэтому и пришлось переключиться на 1 версию.
import sip sip.setapi('QVariant', 1)
Офлайн
На Tkinter делается проще - там есть отдельная функция, которая вешается на Bind - именно по ее коду и определяется нажатая клавиша…
Если я правильно понял вопрос…
Офлайн
dartNNNпробовал на другом компе, исходные:
У меня python 3.1, PyQt 4.8.2 и по-умолчанию используется вторая версия PyQt Api, где QVariant не создается, отсутствует QString и еще кое-чего по-другому. Поэтому и пришлось переключиться на 1 версию.
self.av = QAction(self.lv)
self.av.setShortcut(Qt.Key_Enter)
self.av.triggered.connect(self.selectName)
Отредактировано (Дек. 23, 2011 10:17:20)
Офлайн
Ginibeтут я сам в легком смятении, видимо дело в версии питона.
все работает как и на базе с PyQt версии 4.7.1
GinibeПосмотри пост #7
3 - назначаю слот в случае реализации события
но этого не достаточно, как я понял…
что еще нужно сделать ?
self.fileMenu = self.menuBar().addMenu(self.tr("&File"))
self.fileMenu.addAction(self.quitAct)
self.addAction(self.quitAct)
Офлайн
dartNNNЯ имел в виду код с использованием абстрактной модели и QListView – пост #10.
Посмотри пост #7
Отредактировано (Дек. 24, 2011 00:29:12)
Офлайн
Ginibe, кажется у нас с вами недопонимание возникло. В посте номер 7 описано использование QAction и его добавление к главному окну И К ВИДЖЕТУ!
Если так еще не понятно, то вот я вам даже код готовый приведу
class WindowSlctnList(QWidget):
def __init__(self, *args):
QWidget.__init__(self, *args)
self.quitAct = QtGui.QAction(self.tr("&Quit"), self)
self.quitAct.setShortcut(self.tr("Ctrl+Q"))
self.quitAct.setStatusTip(self.tr("Quit the application"))
self.quitAct.triggered.connect(self.close)
self.addAction(self.quitAct)
Офлайн
dartNNN, повидимому я неправильно задаю вопрос … или не понимаю ответа …
Ваш пример показывает как связать пункт меню “Quit” с сиганлом нажатия хоткея “Ctrl+Q”, а я талдычу про другое … но может нет принципиальной разницы для моего случая
Лучше продемонстрировать что я хочу получить
см. код из поста #10
кстати, dartNNN, Вы же сами его редактировали…
ВАРИАНТ 1
в классе WindowSlctnList переопределил метод keyPressEvent, т.е. добавил следющий код в область вдидимости класса WindowSlctnList:
def keyPressEvent(self, event):
if event.key() == Qt.Key_Return :
self.selectName(self.lv.currentIndex())
# 1 - определяется новое абстрактное событие, типа синал, для представления lv
self.av = QAction(self.lv)
# 2 - назначаем хоткеем [Enter] по нажатию которого событие реализуется
self.av.setShortcut(Qt.Key_Return)
# 3 - назначаем слот в случае реализации события
self.av.triggered.connect(self.selectPress)
# 4 - активация процесса отслеживания события
self.addAction(self.av)
def selectPress (self):
self.selectName(self.lv.currentIndex())
Отредактировано (Дек. 26, 2011 09:13:24)
Офлайн
Вариант 1 исключительно правильный в вашем случае. Функция keyPressEvent для того и сделана открытой, чтобы ее можно (и нужно) было переопределять в своих целях. Зациклившись с QAction я просто забыл про такой вариант. Отличие его в том, что для него необходимо писать класс, наследующий QWidget и переопределяющий keyPressEvent. Т.к. он у вас итак есть, то все красиво и непроблемно.
Плюс QAction в том, что он не требует написания отдельного класса, т.е. например можно взять какой-нибудь стандартный виджет и припаять к нему любой action на любую кнопку. И еще кому-то он может показаться читабельнее в случае большого количества кнопок, чем условные ветвления в keyPressEvent
И еще можно писать вот так:
self.av.triggered.connect(lambda: self.selectName(self.lv.currentIndex()))
Отредактировано (Дек. 26, 2011 06:12:21)
Офлайн
dartNNN, Вы пишете что фукция keyPressEvent сделана открытой, однако в доке по веруии 4.8 на сайте у nokia эта функция стоит в разделе “Protected Functions”, ну и по традиции вопрос:
что же имеется в виду под “Protected Functions” в контексте Qt ?
Хотя ее переопределение не вызвало конфликтов.
Кста… с lambda конечно же красивее и короче, совсем из головы вылетело… :)
Офлайн