В методе `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` по вашему усмотрению, например, для выполнения действий в зависимости от строки.