Qt:QPlainTextEdit的setReadOnly设置为只读,但是输入法仍然可以输入的bug
Qt:QPlainTextEdit的setReadOnly设置为只读,但是输入法仍然可以输入的bug
个人认为,这是qt的一个bug,本人没有报告bug的习惯,仅分享原因分析和解决方法。
bool QPlainTextEdit::isReadOnly() const
{
Q_D(const QPlainTextEdit);
return !(d->control->textInteractionFlags() & Qt::TextEditable);
}
只读是根据Qt::TextEditable这个flag判断的。而 QPlainTextEdit::keyPressEvent(QKeyEvent *e) 中处理了只读的情况,但:
void QPlainTextEdit::inputMethodEvent(QInputMethodEvent *e)
{
Q_D(QPlainTextEdit);
#ifdef QT_KEYPAD_NAVIGATION
if (d->control->textInteractionFlags() & Qt::TextEditable
&& QApplicationPrivate::keypadNavigationEnabled()
&& !hasEditFocus()) {
setEditFocus(true);
selectAll(); // so text is replaced rather than appended to
}
#endif
d->sendControlEvent(e);
ensureCursorVisible();
}
无论是否只读,最终都执行了sendControlEvent。
解决方法:
继承QPlainTextEdit,重载inputMethodEvent函数。
void QtExtReadOnlyPlainTextEdit::inputMethodEvent(QInputMethodEvent* event)
{
if (!(textInteractionFlags() & Qt::TextEditable)) {
event->ignore();
return;
}
__super::inputMethodEvent(event);
}
使用时:
auto textEdit = new QtExtReadOnlyPlainTextEdit(this);
textEdit->setReadOnly(true);
转载请注明来源,谢谢。
有偿解决C++编程问题,承接项目定制开发;寻一份全职或兼职Windows C++开发工作。联系邮箱:[email protected]。