2011-05-24 71 views
1

也許這已被問了很多次,但我找不到解決方案。PyQt:如何接收子類QWidget中的鍵盤事件?

我有一個對話框:

class PostDialog(QtGui.QDialog): 
    def __init__(self, parent=None): 
     QtGui.QDialog.__init__(self, parent) 
     self.ui = Ui_Dialog() #code from designer!! 
     self.ui.setupUi(self) 

     self.ui.plainTextEdit = ContentEditor() 

這個對話框有從設計師QPlainTextEdit。

我需要重寫該QPlainTextEdit的keyPress和keyRelease。

所以我有子類是:

class ContentEditor(QtGui.QPlainTextEdit): 

    def __init__(self, parent=None): 
     QtGui.QPlainTextEdit.__init__(self, parent) 

    def keyPressEvent(self, event): 
     print "do something" 

但ContentEditor.keyPressEvent不會被調用!爲什麼?

回答

3

我推薦使用installEventFilter爲了這個目的:

這看起來像:

class PostDialog(QtGui.QDialog): 
    def __init__(self, parent=None): 
     QtGui.QDialog.__init__(self, parent) 
     self.ui = Ui_Dialog() #code from designer!! 
     self.ui.setupUi(self) 

     self.ui.plainTextEdit.installEventFilter(self) 

    def eventFilter(self, event): 
     if event.type() == QtCore.QEvent.KeyPress: 
      # do some stuff ... 
      return True # means stop event propagation 
     else: 
      return QtGui.QDialog.eventFilter(self, event) 
+0

這工作,謝謝。你的代碼中有一些語法錯誤,但這是答案。無論如何,我不明白這是如何與子類化呢.. – apelliciari 2011-05-25 10:02:36

+0

對不起,語法錯誤,我直接寫沒有測試... – Jeannot 2011-05-25 11:28:48

0

你可能只需要交換以下兩行:

self.ui.setupUi(self) 
self.ui.plainTextEdit = ContentEditor() 

如果你寫這樣的:

self.ui.plainTextEdit = ContentEditor() 
self.ui.setupUi(self) 

你要確保你的自定義窗口小部件被綁定的UI獲得前建立。否則,你只是替換已經初始化的對象的引用。

+0

這並不因爲setupUi self.ui.plainTextEdit工作用QPlainTextEdit對象初始化。 – apelliciari 2011-05-25 07:35:09

1

可能需要調用方法的QWidget的setFocusPolicy接收按鍵事件。 從QWidget API文檔的方法 keyPressEvent

 
This event handler, for event event, can be reimplemented in a subclass 
to receive key press events for the widget. A widget must call setFocusPolicy() 
to accept focus initially and have focus in order to receive a key press event. 
+0

沒有爲我工作 – apelliciari 2011-05-25 10:02:50

+0

你還需要改變其他部件的焦點政策它。例如,您可以設置mywdiget.setFocusPolicy(QtCore.Qt.NoFocus)(在PyQt中)以確保mywidget不會擁有按鍵功能。 – ely 2011-06-07 23:05:21

2

你想實現什麼目標是更好地推動Qt設計的QPlainTextEdit小部件子類ContentEditor完成。
Qt documentation
在 「促進小工具」 對話框:
「促進類名」:ContentEditor
「頭文件」:your_python_module_name.h

+0

這是另一個好辦法!感謝名單! – apelliciari 2011-05-26 08:32:28