qt5 — QScintilla: Как добавить пользовательское контекстное меню в textEdit? (C ++)

Я пытаюсь сообщить QScitilla textEdit, который является основным виджетом моего приложения MainWindow, чтобы он отображал персонализированное контекстное меню при щелчке правой кнопкой мыши.

То, что работает нормально, если я использую стандартный Qt5 textEdit, не работает, если используется с альтернативой QScintilla. Я попробовал это с определением пользовательского меню из некоторых действий:

void MainWindow::contextMenuEvent(QContextMenuEvent *event)
{
QMenu menu(this);
menu.addAction(cutAct);
menu.addAction(copyAct);
menu.addAction(pasteAct);
menu.exec(event->globalPos());
}
#endif // QT_NO_CONTEXTMENU

реагирует на QContextMenuEvent, но меню появляется только тогда, когда я щелкаю правой кнопкой мыши элемент MainWindow вместо textEdit QScintilla. Когда я делаю это в textEdit, отображается только стандартное меню вырезать / копировать / вставить.

Как реализовать это для QScintilla textEdit?

1

Решение

Есть два метода:

Способ 1: установить Qt::CustomContextMenu для политики контекстного меню редактирования текста QScintilla:

    textEdit->setContextMenuPolicy( Qt::CustomContextMenu );
connect(textEdit, SIGNAL(customContextMenuRequested(const QPoint &)),
this, SLOT(ShowContextMenu(const QPoint &)));

}

void MainWindow::ShowContextMenu(const QPoint &pos)
{
QMenu contextMenu(tr("Context menu"), this);

QAction action1("Action 1", this);
connect(&action1, &QAction::triggered, this, []{
qDebug() << "On action 1 click !!!";
});

contextMenu.addAction(&action1);
contextMenu.exec(mapToGlobal(pos));
}

Метод 2: Определите подкласс QScintilla, затем переопределите функцию переопределения contextMenuEvent:

class MyQsciScintilla : public QsciScintilla
{
Q_OBJECT
public:
explicit MyQsciScintilla(QWidget *parent = nullptr);
void contextMenuEvent(QContextMenuEvent *event);
//....
};

void MyQsciScintilla::contextMenuEvent(QContextMenuEvent *event)
{
QMenu *menu = createStandardContextMenu();

menu->addAction(tr("My Menu Item"));
//...
menu->exec(event->globalPos());
delete menu;
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]