c++ - Qt 按键事件处理

标签 c++ qt

我正在尝试用 C++ 为我的图形程序编写一个控制台小部件。我正在使控制台小部件成为充当主窗口的小部件的子小部件。控制台是一个包含 QTextEdit 的 QDockWidget。 我想做的是在从 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 );
}

最佳答案

您需要子类化 QTextEdit 并覆盖那里的 keyPressEvent 方法。请记住,QTextEdit 类将消耗大部分关键事件,因此它们不会向上传播到父停靠小部件。

或者,您可以安装一个事件过滤器。 docs举个好例子。在您的情况下,您的自定义停靠小部件类可以是 QTextEdit 的事件过滤器,因此您的逻辑都在该类中。

关于c++ - Qt 按键事件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5225352/

相关文章:

c++ - 如何删除析构函数中的void指针?

c++ - 如何在 C++、Qt、QML、Blackberry 10 Cascades Beta 3 SDK 中制作图表/图形(如折线图、条形图、圆图)等?

c++ - QNetworkAccessManager 和 authenticationRequired

c++ - QMAKE_EXTRA_COMPILERS 变量使 INCLUDEPATH 无效

qt - QNetwork TLS 可移植

c++ - 使函数参数成为具有多个参数的函数的错误

c++ - Visual Studio 2012 在调试期间找不到资源文件

c++ - 在 #error 预处理器指令中带有撇号的警告

c++ - QStandarditem 拒绝构造函数中的 QString

c++ - 在 C/C++ 中高效地从结构化文件中读取数据