Использование фильтров событий для такой простой задачи не выглядит хорошей идеей, поскольку вы вынуждены реализовать либо отдельный класс, наследующий QPlainTextEdit, либо создать какой-то отдельный класс, работающий в качестве фильтра.Вместо этого вы также можете сделать следующее:
// Note. This is just a sample. Assume that 'this' is context of some class (e.g. class implementing QDialog/QMainWindow)
auto lineEdit = new QLineEdit();
/*
Here, you can use also &QLineEdit::textChanged, and it would not cause any stackoverflow,
since Qt is pretty optimized here, i.e. if text does not change actually (value of QString
remains the same), Qt won't fire the signal. However, it is probably better to use
&QLineEdit::textEdited, since you expect the user to enter the text.
*/
connect(lineEdit, &QLineEdit::textEdited, this, [lineEdit](const QString& text)
{
lineEdit->setText(text.toUpper());
});
Другими словами, вы можете добиться того же поведения, которое требуется, с помощью простого механизма сигналов и слотов, который дает нам Qt.Если вы можете достичь того, чего хотите, с помощью стандартных механизмов инфраструктуры, то вам следует попробовать это вместо того, чтобы пытаться реализовать фильтр событий, который может вызвать проблемы, о которых вы даже не подозреваете.Имейте в виду, что фильтр событий - это еще один механизм, предоставляемый Qt, который дает вам больше свободы делать то, что вы хотите делать, но вы также должны использовать гораздо больше угловых случаев.