Как отобразить мигающий курсор в QLineEdit только для чтения - PullRequest
1 голос
/ 06 июня 2019

название в значительной степени говорит само за себя. У меня есть текстовое поле только для чтения в форме, где пользователи могут редактировать содержимое этого текстового поля с помощью кнопок на форме. Форма в основном клавиатура. Когда пользователи нажимают кнопки, к значению в текстовом поле будет добавлена ​​цифра.

Технически, конечное приложение будет работать на машине без клавиатуры, но с сенсорным экраном. Пользователи взаимодействуют с приложением с помощью сенсорного экрана, и им не следует устанавливать на компьютере клавиатуры, но в этом случае я делаю текстовое поле только для чтения.

Теперь, как мне по-прежнему мигать курсор текстового поля, даже если он доступен только для чтения?

Мне интересно, нужно ли мне сделать что-то похожее на решение этого пользователя:

Скрыть мигающий курсор QLineEdit

Я также пытался использовать метод setFocus и изучаю таблицы стилей. Однако ничего не получилось.

Ответы [ 3 ]

1 голос
/ 06 июня 2019

Создайте класс, который наследуется от QLineEdit и игнорируйте ключевые события (события, которые запускаются, когда пользователь нажимает клавишу). Это сделает редактирование вашей строки доступным только для чтения, но без внешнего вида:

class LineEdit: public QLineEdit
{
    Q_OBJECT
public:
    LineEdit(QWidget* parent=nullptr): QLineEdit(parent)
    {
    }
    virtual void keyPressEvent(QKeyEvent* event)
    {
        event->ignore();
    }

public slots:
    void add(QString const& textToAdd)
    {
        setText(text() + textToAdd);
    }
};

Пример использования (таймер имитирует виртуальную клавиатуру):

LineEdit* line = new LineEdit;
line->show();

QTimer timer;
timer.setInterval(2000);
QObject::connect(&timer, &QTimer::timeout, [=]() { line->add("a"); });
timer.start();
1 голос
/ 06 июня 2019

Другие ответы дали вам технические решения для вашего вопроса.Тем не менее, я думаю, что вы идете в неправильном направлении.Вы хотите QLineEdit, который только для чтения, но с курсором и все еще принимает ввод с виртуальной клавиатуры ... да, так что это не совсем для чтения ... Это не пахнет хорошо.И вообще, произвольно и активно отключать стандартные функции не очень хорошая идея.Особенно, если это означает взламывание стандартного поведения виджетов и семантику для этого.

Давайте подумаем с самого начала.В чем проблема приема ввода с клавиатуры?Исходя из вашего вопроса, я бы осмелился догадаться, что вы хотите убедиться, что QLineEdit принимает только цифры, и запретить пользователю вводить другие символы.

Если я прав, то вы хотите QValidator, либоQIntvalidator или QRegExpValidator.Затем вы можете позволить пользователям использовать клавиатуру, но они смогут вводить цифры только так, как они делают это с вашей виртуальной клавиатурой.

1 голос
/ 06 июня 2019

Кажется, что ответ Ромхи Кореева сработает, но не все поймает. Тем не менее, можно по-прежнему вставлять или перетаскивать текст в строку редактирования или в результате события клавиатуры, зависящего от локали, метода ввода. Я не знаю, каким образом текст может быть введен в строку редактирования таким образом. Вы бы охотились за отверстиями для пробки.

Поэтому я предлагаю использовать 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().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...