Qt处理keyevents

时间:2011-03-07 21:16:54

标签: c++ qt

我正在尝试用C ++编写一个控制台小部件到我的图形程序。我正在使控制台小部件成为作为主窗口的小部件的子小部件。控制台是一个QDockWidget,它包含一个QTextEdit。 我想要做的是当从ConsoleWidget按下Return键然后处理命令时处理事件,所有其他关键事件应该由QTextEdit 处理。问题是我无法捕获除Command和Shift键之类的事件之外的任何关键事件......任何想法?

这是控制台的代码:

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 );
}

1 个答案:

答案 0 :(得分:3)

您需要继承QTextEdit并覆盖keyPressEvent方法。请记住,QTextEdit类将消耗大多数关键事件,因此它们不会传播到父停靠窗口小部件。

或者,您可以安装事件过滤器。 docs给出了一个很好的例子。在您的情况下,您的自定义停靠窗口小部件类可以是QTextEdit的事件过滤器,以便您的逻辑完全在该类中。