QTextEdit - 如何在onKeyPress()中“取消”输入的密钥代码

时间:2015-06-02 09:13:57

标签: c++ qt

我正在ImmutableArraycancel中尝试“QTextEdit”关键代码。当我说取消时,我的意思是,我想根据输入的密钥将“输入”字符变为“无”。示例:如果用户在键盘上点击“a”或“b”,我不希望在文本中显示/输入“a”或“b”,相反,输入将被忽略并变为空/赢不会被处理。

使用C ++ Builder,您有QPlainTextEdit和“Key”参数。一旦检测到输入的密钥代码,如果您不喜欢它,可以将“密钥”参数设置为0,因此您设置“密钥= 0”并且不会显示密钥笔划。我如何在Qt中实现同样的目标?

让我用代码解释一下:

KeyDown_Event

我如何在Qt中执行此操作?

我累了做e-> setAccepted(false)和e-> Ignore()但它没有任何区别。我认为在执行e-> ignore()时,“char”已经插入到文本框中。使用C ++ Builder,您可以使用KeyDown事件拦截它并取消它。我似乎无法找到Qt的方式。

THX

1 个答案:

答案 0 :(得分:2)

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