2

我有这个代码:

bool MainWindow::eventFilter(QObject *obj, QEvent *event)
{
    QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);

    if (event->type() == QEvent::KeyPress)
    {
        if (keyEvent->key() == Qt::Key_Tab)
            // do something
    }
}

现在,我正在输入一个 QTextEdit。所以说我按了tab键。然后在 QTextEdit 中会出现一个选项卡。但是,如果我想防止这种情况发生怎么办?打个比方,如果你熟悉 emacs:在正确的环境中(比如 c++ 模式),你可以点击 tab,行会跳转到正确的位置(缩进)。再次点击选项卡后,没有任何反应。这是因为代码行在正确的位置。

这里有人知道怎么做吗?我想我可以让 tab 事件显示在 QTextEdit 中,然后删除以前的字符(或任何定义的字符)。

4

2 回答 2

3

使用事件过滤器函数的返回值可以让您控制 QTextEdit 接收哪些事件(如果您真的不想只是子类化它):

if (keyEvent->key() == Qt::Key_Tab)
    return true;

返回true表示应该过滤事件。

于 2012-04-21T13:48:22.257 回答
2

您不需要全局事件过滤器来执行特殊的键盘处理(除非出于某种原因,您不能编辑小部件设置为 QTextEdit 的部分)。您可以从 QTextEdit 派生一个类并覆盖其虚拟键方法:

http://doc.qt.io/qt-5/qwidget.html#keyPressEvent

要获得给定keyEvent的默认行为,您可以将其传递给QTextEdit::keyPressEvent(),而忽略它,您只需返回而不调用它。

于 2012-04-21T13:20:12.343 回答