2015-02-26 4 views
0

Я разработал gui в Qt Designer, который помимо прочего отображает виджет QTextEdit.Проблемы с обработкой события QTextEdit()

Мне нужно обработать пользователя, который вводит определенные комбинации клавиш (клавиша TAB, SHIFT + ВВОД и SHIFT + RETURN до сих пор) таким образом, что он не отображает эти символы в виджетах QTextEdit и реализует некоторые пользовательские функции ,

Я создал обработчик для обнаружения keyReleaseEvent с, но это, кажется, слишком поздно, чтобы предотвратить табуляции, возврата каретки и т.п. получение отображается, поэтому я попытался обработки keyPressEvent с, но это не кажется работать вообще. Из того, что я читал в Интернете, люди говорят, что keyPressEvent потребляется виджетами и поэтому никогда не распространяется до gui. Я не знаю достаточно о виджетах QTextEdit, чтобы сказать, правильно ли это, но пока я предполагаю, что это так.

Тогда я попробовал это в методе класса __init__ для графического интерфейса (я оставил чек на ключ RETURN, чтобы сохранить код коротким ниже:

self.textEdit.event = self.eventX

Вот код eventX метод:

def eventX(self, event): if event.type() == QEvent.KeyPress and event.key() == Qt.Key_Tab: print 'CODE WINDOW: Tab pressed' self.textEdit.insertPlainText(QString('| |')) self.textEdit.update() event.accept() return True elif event.type() == QEvent.KeyPress and (event.key() == Qt.Key_Enter) and event.modifiers() & Qt.ShiftModifier: print 'CODE WINDOW: Shift pressed with Enter' self.submitCode() self.textEdit.update() event.accept() return True else: event.ignore() return QWidget.event(self, event)

Это где все становится странно, выше код будет сортировать работы, если я указал, что:. verticalScrollBarPolicy = Qt.ScrollBarAsNeeded для виджета QTextEdit, за исключением того, что он фактически не отображает символы в виджетах, но, похоже, он обрабатывает нажатые клавиши TAB и SHIFT-ENTER/SHIFT-RETURN?

И тогда, если я установил verticalScrollBarPolicy = Qt.ScrollBarAlwaysOn, метод eventX, похоже, полностью игнорируется!

Это сбивает меня с ума на этом этапе. Кто-нибудь знает, что я делаю неправильно?

Спасибо.


UPDATE: На основе информации, полученной от MDURANT, теперь у меня есть код ниже, который работает для меня:

def handleEditorKeyPress(self, event): if event.key() == Qt.Key_Tab: # My custom code goes here. event.accept() return elif event.key() == Qt.Key_Enter and event.modifiers() & Qt.ShiftModifier: # My custom code goes here. event.accept() return elif event.key() == Qt.Key_Return and event.modifiers() & Qt.ShiftModifier: # My custom code goes here. event.accept() return else: event.ignore() return QTextEdit.keyPressEvent(self.textEdit, event)

ответ

1

В качестве примера захвата ключевых событий. В этом случае, я просто передать событие через к другой такой же виджет, но в целом, вы можете установить функцию событий ни к чему

class win(QtGui.QWidget): 
    def __init__(self): 
     QtGui.QWidget.__init__(self, parent=None) 
     self.box = QtGui.QHBoxLayout(self) 
     self.setLayout(self.box) 
     self.ed1 = QtGui.QTextEdit(self) 
     self.ed2 = QtGui.QTextEdit(self) 
     self.ed1.keyPressEvent = self.ed2.keyPressEvent 
     self.ed1.keyReleaseEvent = self.ed2.keyReleaseEvent 
     self.box.addWidget(self.ed1) 
     self.box.addWidget(self.ed2) 

Смотрите документацию мероприятия: http://qt-project.org/doc/qt-4.8/qtextedit.html#keyPressEvent

Смежные вопросы