c++ - 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 实现它?
解决方案
有两种方法:
方法 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;
}
推荐阅读
- python - 循环的根查找(牛顿)几个值
- angular - 将任何值解析为枚举
- node.js - Mongoose 嵌套填充 TypeError
- javascript - jQuery 列表项和菜单方法/功能
- ansible - 为模块 Ansible 设置常量参数
- xslt - 使用XSLT转置xml中的一些节点
- python - 将搜索到的查询传递到另一个视图
- android - 显示对话框时如何为活动设置动画
- udp - How to disable udp in shadowsocks or outline server without modifying Client-side code (How to modify shadowsocks server to use pure tcp (not udp))
- qt - 除了像 GTest 实现这样的可执行文件之外,在 CTest 中注册 QTest 上的测试