QTextEdit - 如何在 onKeyPress() 中"cancel"输入的键代码

QTextEdit - How to "cancel" entered key codes in onKeyPress()

本文关键字:cancel 输入 代码 onKeyPress QTextEdit      更新时间:2023-10-16

我正在尝试在QTextEditQPlainTextEdit中输入" cancel "键代码。当我说取消时,我的意思是,我想根据输入的键将"已输入"字符变为"无"。例如:如果用户在键盘上点击"a"或"b",我不想让"a"或"b"显示/输入到文本中,相反,输入将被忽略并变成什么都没有/不会被处理。

使用c++ Builder,您有一个KeyDown_Event和一个"Key"参数。一旦检测到输入的按键代码,如果不喜欢,可以将"key"参数设置为0,即设置"key = 0",则不显示按键。我如何实现同样的事情在Qt?

让我用代码解释一下:

if (e->key() == 67)
    // do not send "c" to the QTextEdit (In C++ Bullder, you would do Key = 0)
if (e->key() == 65)
    // do not send "a" to the QTextEdit (In C++ Bullder, you would do Key = 0)

我如何在Qt中做到这一点?

我尝试了e->setAccepted(false)和e->Ignore(),但是没有区别。我认为在执行e->ignore()时,"char"已经插入到文本框中。使用c++ Builder,您可以使用KeyDown事件拦截并取消它。我似乎找不到Qt的方法。

Thx

类似void QObject::installEventFilter ( QObject * filterObj )的例子:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent)
{
    setupUi(this);
    textEdit->installEventFilter(this);
}
bool MainWindow::eventFilter(QObject *watched, QEvent *event)
{
    if (watched == textEdit && event->type() == QEvent::KeyPress) {
        QKeyEvent *e = static_cast < QKeyEvent * >(event);
        if (e->key() == Qt::Key_A) {
            return true;
        }
    }
    return QMainWindow::eventFilter(watched, event);
}

正如IInspectable注意到的,这不会帮助您过滤Ctrl+C/Ctrl+V方法。如果你需要这些,你需要连接到QTextEdit::textChanged信号并手动更新文本。像这样:

static QString oldString;
QString s = textEdit->toPlainText();
if (s == oldString)
   return;
int pos = textEdit->textCursor().position();
s.remove('a', Qt::CaseInsensitive);
oldString = s;
textEdit.setPlainText(s);
QTextCursor cursor = textEdit->textCursor();
cursor.setPosition(pos);
textEdit->setTextCursor(cursor);