Arrow
May 16, 2017, 8:20 p.m.

Курсор ввода текста в графическом режиме

Курсор ввода текста, Qt, QGraphicsScene

Реализовал я ввод текста пользователем при клике мышью в QGraphicsScene. Остался только один вопрос: как реализовать курсор ввода текста? Без него все выглядит не привычно. Ввод самого текста реализовал так:

void mousePressEvent(QGraphicsSceneMouseEvent * event) override;
void keyPressEvent(QKeyEvent *event) override;

void textTyping(const QString text);

bool m_textTyping;
QString m_text;

// ----------------------------

void PaintScene::mousePressEvent(QGraphicsSceneMouseEvent *event)
{  
        if (m_textTyping) {
            m_textTyping = !m_textTyping;
            m_text.clear();
            return;
        }
        m_textTyping = true;

    // Сохранить координаты точки нажатия
    setPrevPos(event->scenePos());
}

void PaintScene::keyPressEvent(QKeyEvent *event)
{
    if (m_textTyping) {
        emit textTyping(event->text());
    }
    QGraphicsScene::keyPressEvent(event);
}

void PaintScene::typingText(const QString text)
{
    // Отображение текста
    if (m_text.isEmpty()) { 
        m_text.append(text);
        QGraphicsTextItem *textItem = new QGraphicsTextItem(m_text);
        currentItem = textItem;
        addItem(currentItem);
        textItem->setPos(m_prevPos);
        textItem->setDefaultTextColor(currentColor);
        textItem->setFont(QFont("Arial", 14));
        textItem->setSelected(true);
    }
    else {
        m_text.append(text);
        QGraphicsTextItem *textIt = qgraphicsitem_cast<QGraphicsTextItem *>(currentItem);
        textIt->setPlainText(m_text);
    }
}
Удаления и текста и навигации по нему пока не реализовывал. Мысль по реализации такая: 1. Выводить в качестве курсора вертикальную черту " | " и по таймеру реализовать ее скрытие и показ. Возможно добавлять ее до введенного текста и удалять; (Мысль плохая) 2. По таймеру выводить рисованный курсор в конце строки и организовать его мигание по таймеру. Или другим способом будет правильнее? Может ввод текста вообще реализовывается по другому? С такими вещами ранее не работал вообще.
2

Do you like it? Share on social networks!

2
Evgenii Legotckoi
  • May 16, 2017, 9:06 p.m.
  • The answer was marked as a solution.

Переусложняете, чуть более, чем слишком. Вот минимальный достаточный код для вашей задумки:

void PaintScene::mousePressEvent(QGraphicsSceneMouseEvent* event)
{
    QGraphicsTextItem *textItem = new QGraphicsTextItem();
    addItem(textItem);
    textItem->setPos(event->scenePos());
    textItem->setTextInteractionFlags(Qt::TextEditorInteraction);
    textItem->setFocus();
}
    Arrow
    • May 17, 2017, 5:57 p.m.

    Супер! Большое спасибо!

    Перемудрил по незнанию :)

      Comments

      Only authorized users can post comments.
      Please, Log in or Sign up
      • Last comments
      • AK
        April 1, 2025, 11:41 a.m.
        Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
      • Evgenii Legotckoi
        March 9, 2025, 9:02 p.m.
        К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
      • VP
        March 9, 2025, 4:14 p.m.
        Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
      • ИМ
        Nov. 22, 2024, 9:51 p.m.
        Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
      • Evgenii Legotckoi
        Oct. 31, 2024, 11:37 p.m.
        Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup