Как в методе QTextEdit::contextMenuEvent определить номер строки?

Как можно получить номер строки, на которой было вызвано контекстное меню в функции QTextEdit::contextMenuEvent?
  • 23 сентября 2024 г. 14:13
Ответы на вопрос 2
В методе `QTextEdit::contextMenuEvent` вы можете определить номер строки, на которой было вызвано контекстное меню, следующим образом:

1. Получите позицию курсора в событиях контекстного меню.
2. Переведите эту позицию в текстовую позицию.
3. Используйте метод `QTextCursor::block()` для получения блока текста, соответствующего этой позиции.
4. Затем вы можете использовать метод `QTextBlock::firstLineNumber()` для определения номера строки.

Вот пример кода на C++:

```cpp
#include <QTextEdit>
#include <QMenu>
#include <QContextMenuEvent>
#include <QTextCursor>
#include <QTextBlock>

class MyTextEdit : public QTextEdit {
    Q_OBJECT
public:
    MyTextEdit(QWidget *parent = nullptr) : QTextEdit(parent) {}

protected:
    void contextMenuEvent(QContextMenuEvent *event) override {
        // Получаем позицию события
        QPoint pos = event->pos();

        // Получаем текстовый курсор, связанный с этой позицией
        QTextCursor cursor = cursorForPosition(pos);

        // Получаем блок текста, соответствующий курсору
        QTextBlock block = cursor.block();

        // Получаем номер первой строки блока
        int lineNumber = block.firstLineNumber() + block.layout()->lineCount();

        // Создаем контекстное меню
        QMenu contextMenu(this);
        contextMenu.addAction("Action 1");
        contextMenu.addAction("Action 2");

        // Практически здесь можно вывести номер строки или использовать его по-другому
        qDebug() << "Line number:" << lineNumber;

        // Показать контекстное меню
        contextMenu.exec(event->globalPos());
    }
};
```

В этом коде:

- Мы переопределяем метод `contextMenuEvent`.
- Получаем позицию курсора и преобразуем ее в `QTextCursor`.
- Извлекаем `QTextBlock` и получаем номер строки.
- Появляется контекстное меню, и вы можете использовать `lineNumber` по вашему усмотрению, например, для выполнения действий в зависимости от строки.
Чтобы получить номер строки, на которой произошло вызов контекстного меню в QTextEdit, необходимо переопределить метод contextMenuEvent. В этом методе можно использовать позицию курсора, чтобы определить, на какой строке находится курсор в момент вызова контекстного меню.
Похожие вопросы