Найти - Пользователи
Полная версия: Обработчик событий
Начало » GUI » Обработчик событий
1 2
Corban_Dallas
Здравствуйте.
Возникло небольшое недопонимание с переопределением функции 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)
Возможно кто то подскажет мне, как эту проблему обойти.
Rodegast
event.accept()
Corban_Dallas
Rodegast
event.accept()
Спасибо за наводку, но всё же “недогнал”.
Rodegast
def keyPressEvent(self, event):
      if event.key() == QtCore.Qt.Key_Enter or event.key() == QtCore.Qt.Key_Return:
             ......
      else:
             event.accept()
Corban_Dallas
Значит всё же догнал, потому что так сразу и сделал, просто таблетка оказалась не подходящая, виджет так же не реагирует на другие клавиши с клавиатуры.
Rodegast
Эта “таблетка” у меня прекрасно работает. Код который получился в студию!
Corban_Dallas
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, и остальные, виджет не реагирует.
py.user.next
#!/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()
проверь
Corban_Dallas
py.user.next
Ваш пример работает, не не так как мне изначально требовалось. В том то и проблема, что мне надо переназначить лишь одну клвашу, а реакцию виджета на остальные оставить стандартной. В вашем примере при нажатии на enter выполняется один указанный код, а при нажатии на любую другую, другой указанный код. Извиняюсь за тавтологию.
p.s. И не могу понять причину использовать функцию event.accept(), с неё и без неё виджет работает вобщем то, без изменений.
py.user.next
#!/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()
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