Форум сайта python.su
Здравствуйте.
Возникло небольшое недопонимание с переопределением функции keyPressEvent, для моего класса на основе QLineEdit, ниже приведу интересующий из него отрывок:
class CommandLine(QLineEdit): def __init__(self): QLineEdit.__init__(self) def keyPressEvent(self, event): if (event.key() == Qt.Key_Return): ...
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)
Офлайн
event.accept()
Офлайн
RodegastСпасибо за наводку, но всё же “недогнал”.
event.accept()
Офлайн
def keyPressEvent(self, event): if event.key() == QtCore.Qt.Key_Enter or event.key() == QtCore.Qt.Key_Return: ...... else: event.accept()
Офлайн
Значит всё же догнал, потому что так сразу и сделал, просто таблетка оказалась не подходящая, виджет так же не реагирует на другие клавиши с клавиатуры.
Отредактировано Corban_Dallas (Май 16, 2014 21:48:01)
Офлайн
Эта “таблетка” у меня прекрасно работает. Код который получился в студию!
Офлайн
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()
Отредактировано Corban_Dallas (Май 17, 2014 07:56:38)
Офлайн
#!/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)
Офлайн
py.user.next
Ваш пример работает, не не так как мне изначально требовалось. В том то и проблема, что мне надо переназначить лишь одну клвашу, а реакцию виджета на остальные оставить стандартной. В вашем примере при нажатии на enter выполняется один указанный код, а при нажатии на любую другую, другой указанный код. Извиняюсь за тавтологию.
p.s. И не могу понять причину использовать функцию event.accept(), с неё и без неё виджет работает вобщем то, без изменений.
Отредактировано Corban_Dallas (Май 17, 2014 17:52:30)
Офлайн
#!/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да, забыл проверить, там нужно .ignore()
В вашем примере при нажатии на enter выполняется один указанный код, а при нажатии на любую другую, другой указанный код.
Отредактировано py.user.next (Май 17, 2014 21:47:16)
Офлайн