Уведомления

Группа в Telegram: @pythonsu

#1 Май 16, 2014 18:59:20

Corban_Dallas
Зарегистрирован: 2014-02-21
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработчик событий

Здравствуйте.
Возникло небольшое недопонимание с переопределением функции keyPressEvent, для моего класса на основе QLineEdit, ниже приведу интересующий из него отрывок:

class CommandLine(QLineEdit):
    def __init__(self):
        QLineEdit.__init__(self)
    def keyPressEvent(self, event):
        if (event.key() == Qt.Key_Return):
            ...
При нажатии клавиши enter мой код исправно исполняется, но виджет перестал реагировать на события нажатия других клавиш, когда необходимо что бы он в этом случае вёл себя стандартно. Погуглив нашел простой пример на си как это решается:
void MyCheckBox::mousePressEvent(QMouseEvent *event)
 {
     if (event->button() == Qt::LeftButton) {
         // здесь обрабатываем левую кнопку мыши
     } else {
         // передаём остальные кнопки в базовый класс
         QCheckBox::mousePressEvent(event);
     }
 }
попытался по аналогии изменить свой код, но результат нулевой:
def keyPressEvent(self, event):
    if (event.key() == Qt.Key_Return):
        ...
    else:
        QLineEdit().keyPressEvent(event)
Возможно кто то подскажет мне, как эту проблему обойти.

Отредактировано Corban_Dallas (Май 16, 2014 21:50:38)

Офлайн

#2 Май 16, 2014 20:22:13

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2756
Репутация: +  184  -
Профиль   Отправить e-mail  

Обработчик событий

event.accept()



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#3 Май 16, 2014 21:03:14

Corban_Dallas
Зарегистрирован: 2014-02-21
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработчик событий

Rodegast
event.accept()
Спасибо за наводку, но всё же “недогнал”.

Офлайн

#4 Май 16, 2014 21:27:30

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2756
Репутация: +  184  -
Профиль   Отправить e-mail  

Обработчик событий

def keyPressEvent(self, event):
      if event.key() == QtCore.Qt.Key_Enter or event.key() == QtCore.Qt.Key_Return:
             ......
      else:
             event.accept()



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#5 Май 16, 2014 21:47:51

Corban_Dallas
Зарегистрирован: 2014-02-21
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработчик событий

Значит всё же догнал, потому что так сразу и сделал, просто таблетка оказалась не подходящая, виджет так же не реагирует на другие клавиши с клавиатуры.

Отредактировано Corban_Dallas (Май 16, 2014 21:48:01)

Офлайн

#6 Май 16, 2014 22:05:20

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2756
Репутация: +  184  -
Профиль   Отправить e-mail  

Обработчик событий

Эта “таблетка” у меня прекрасно работает. Код который получился в студию!



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#7 Май 17, 2014 07:53:52

Corban_Dallas
Зарегистрирован: 2014-02-21
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработчик событий

Rodegast, это довольно странно, но у меня не работает, быть может расходимость из-за разных версий qt, я использую PyQt GPL v4.10.4 for Python v3.3 (x32). Код фактически не отличается от вашего примера:

class CommandLine(QLineEdit):
    def __init__(self):
        QLineEdit.__init__(self)
        ....
    def keyPressEvent(self, event):
        if (event.key() == Qt.Key_Return):
            ....
        else:
            event.accept()
Как уже говорил, код указанный для случая нажатия на enter выполняется, но на другие клавиши, как собственно и на сочетания ctrl+c ctrl+v, и остальные, виджет не реагирует.

Отредактировано Corban_Dallas (Май 17, 2014 07:56:38)

Офлайн

#8 Май 17, 2014 12:50:20

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9882
Репутация: +  853  -
Профиль   Отправить e-mail  

Обработчик событий

#!/usr/bin/env python3
 
import sys
from PyQt4 import QtGui, QtCore
 
 
class Example(QtGui.QWidget):
 
    def __init__(self):
        super(Example, self).__init__()
 
        self.initUI()
 
    def initUI(self):
 
        self.cl = CommandLine(self)
        self.setGeometry(500, 500, 200, 100)
        self.setWindowTitle('LineEdit')
        self.show()
 
 
class CommandLine(QtGui.QLineEdit):
 
    def __init__(self, parent=None):
        super(CommandLine, self).__init__(parent)
        self.n = 0
 
    def keyPressEvent(self, event):
        self.n += 1
        if event.key() == QtCore.Qt.Key_Return:
            self.setText('<enter {}>'.format(self.n))
        else:
            event.accept()
            self.setText('<another {}>'.format(self.n))
 
 
def main():
 
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
 
 
if __name__ == '__main__':
    main()
проверь



Отредактировано py.user.next (Май 17, 2014 21:49:19)

Офлайн

#9 Май 17, 2014 17:47:48

Corban_Dallas
Зарегистрирован: 2014-02-21
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Обработчик событий

py.user.next
Ваш пример работает, не не так как мне изначально требовалось. В том то и проблема, что мне надо переназначить лишь одну клвашу, а реакцию виджета на остальные оставить стандартной. В вашем примере при нажатии на enter выполняется один указанный код, а при нажатии на любую другую, другой указанный код. Извиняюсь за тавтологию.
p.s. И не могу понять причину использовать функцию event.accept(), с неё и без неё виджет работает вобщем то, без изменений.

Отредактировано Corban_Dallas (Май 17, 2014 17:52:30)

Офлайн

#10 Май 17, 2014 21:45:53

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9882
Репутация: +  853  -
Профиль   Отправить e-mail  

Обработчик событий

#!/usr/bin/env python3
 
import sys
from PyQt4 import QtGui, QtCore
 
 
class Example(QtGui.QWidget):
 
    def __init__(self):
        super(Example, self).__init__()
 
        self.initUI()
 
    def initUI(self):
 
        self.cl = CommandLine(self)
        self.setGeometry(500, 500, 200, 100)
        self.setWindowTitle('LineEdit')
        self.show()
 
    def keyPressEvent(self, event):
        self.cl.move(self.cl.x(), self.cl.y() + 3)
 
 
class CommandLine(QtGui.QLineEdit):
 
    def __init__(self, parent=None):
        super(CommandLine, self).__init__(parent)
        self.n = 0
 
    def keyPressEvent(self, event):
        self.n += 1
        if event.key() == QtCore.Qt.Key_Return:
            self.setText('<enter {}>'.format(self.n))
        else:
            event.ignore()
            self.setText('<another {}>'.format(self.n))
 
 
def main():
 
    app = QtGui.QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())
 
 
if __name__ == '__main__':
    main()

Corban_Dallas
В вашем примере при нажатии на enter выполняется один указанный код, а при нажатии на любую другую, другой указанный код.
да, забыл проверить, там нужно .ignore()



Отредактировано py.user.next (Май 17, 2014 21:47:16)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version