QScintilla: Как добавить пользовательское контекстное меню в textEdit?(C ++) - PullRequest
0 голосов
/ 23 декабря 2018

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

Что хорошо работает, если я использую стандартный Qt5textEdit завершается ошибкой, если используется с альтернативой 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 вместо QScintilla textEdit.Когда я делаю это в textEdit, отображается только стандартное меню вырезать / копировать / вставить.

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

1 Ответ

0 голосов
/ 24 декабря 2018

Существует два метода:

Метод 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;
}
...