2011-03-07 67 views
1

我想在C++中爲我的圖形程序編寫一個控制檯小部件。我將控制檯窗口小部件作爲一個子窗口小部件作爲主窗口。控制檯是一個包含QTextEdit的QDockWidget。 我想要做的是處理事件,當從ConsoleWidget按下Return鍵並處理該命令時,所有其他鍵事件都應該由QTextEdit處理。問題是我無法捕捉除Command和Shift鍵之外的任何關鍵事件...任何想法?Qt處理keyevents

這是控制檯的代碼:

class ConsoleWidget : public QDockWidget 
{ 
public: 
    ConsoleWidget(const QString& sTitle, QWidget* pParent = 0, Qt::WindowFlags nFlags = 0); 
    ~ConsoleWidget(); 

protected: 
    void keyPressEvent(QKeyEvent* pEvent); 
    void keyReleaseEvent(QKeyEvent* pEvent); 

private: 
    QTextEdit* m_pTextArea; 
}; 


ConsoleWidget::ConsoleWidget(const QString& sTitle, QWidget* pParent, Qt::WindowFlags nFlags) : 
     QDockWidget(sTitle, pParent, nFlags) 
{ 
    setFocusPolicy(Qt::StrongFocus); 
    m_pTextArea = new QTextEdit(this); 
    setWidget(m_pTextArea); 
} 

ConsoleWidget::~ConsoleWidget() 
{ 
    // Qt is taking ownership of pTextWidget... (I think) 
} 

void ConsoleWidget::keyPressEvent(QKeyEvent* pEvent) 
{ 
    if(pEvent->key() & Qt::Key_Return) 
    { 
     int i = 666; 
    } 
    else 
    { 
     pEvent->setAccepted(false); 
     // TODO Should I do this if not handling the event? 
     //QDockWidget::keyPressEvent(pEvent); 
    } 
} 

void ConsoleWidget::keyReleaseEvent(QKeyEvent* pEvent) 
{ 
    QDockWidget::keyReleaseEvent(pEvent); 
} 
+0

是的,對於這種情況,正如Troubadour所言,installEventFilter()將會是一條路。讓它「吃」回車鍵。那麼數字鍵盤Key_Enter呢?也許趕上那個? – Robin 2011-03-11 13:56:26

回答

3

您需要繼承QTextEdit和覆蓋keyPressEvent方法那裏。請記住QTextEdit類將消耗大部分關鍵事件,因此它們不會傳播到父Dock部件。

或者,您可以安裝事件過濾器。 docs就是一個很好的例子。在你的情況下,你自定義的dock widget類可以是QTextEdit的事件過濾器,這樣你的邏輯就全部在這個類中。