首页 > 解决方案 > QScintilla:如何将用户上下文菜单添加到 textEdit?(C++)

问题描述

我正在努力告诉作为我的 MainWindow 应用程序的主要小部件的 QScitilla textEdit 接受在右键单击鼠标时显示个性化的上下文菜单。

如果与 QScintilla 替代方案一起使用,如果我使用标准 Qt5 textEdit 会失败。我尝试通过一些操作定义用户菜单:

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 实现它?

标签: c++qt5qscintilla

解决方案


有两种方法:

方法 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;
}

推荐阅读