Кажется, что ответ Ромхи Кореева сработает, но не все поймает. Тем не менее, можно по-прежнему вставлять или перетаскивать текст в строку редактирования или в результате события клавиатуры, зависящего от локали, метода ввода. Я не знаю, каким образом текст может быть введен в строку редактирования таким образом. Вы бы охотились за отверстиями для пробки.
Поэтому я предлагаю использовать QValidator для этого. Не устанавливайте вашу строку редактирования в режиме только для чтения. Создайте свой собственный валидатор, который блокирует весь ввод, если вы специально не отключили его:
class InputBlockerValidator final: public QValidator
{
Q_OBJECT
public:
void enable()
{ is_active_ = true; }
void disable()
{ is_active_ = false; }
QValidator::State validate(QString& /*input*/, int& /*pos*/) const override
{
if (is_active_) {
return QValidator::Invalid;
}
return QValidator::Acceptable;
}
private:
bool is_active_ = true;
};
Теперь установите экземпляр этого в качестве валидатора вашей строки edit:
// ...
private:
QLineEdit lineedit_;
InputBlockerValidator validator_;
// ...
lineedit_.setValidator(&validator_);
Затем, когда вы вставляете текст в строку редактирования, отключите и снова включите валидатор:
validator_.disable();
lineedit_.insert(text_to_be_inserted);
validator_.enable();
Никогда не вызывайте setText()
в строке edit. По какой-то причине это постоянно предотвращает блокировку ввода валидатором. Я не знаю, предназначено ли это или ошибка Qt. Используйте только insert()
. Для имитации setText()
используйте clear()
, а затем insert()
.