2011-03-07 51 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的事件过滤器,这样你的逻辑就全部在这个类中。