我的解决办法是:子类化QWebEngineView,设置上下文菜单模式为Qt::DefaultContextMenu,然后重新实现contextMenuEvent(QContextMenuEvent* event)即可,亲测有效
#ifndef webview_h__
#define webview_h__
#include <QWebEngineView>
class QMenu;
class QAction;
class CWebView : public QWebEngineView
{
Q_OBJECT
public:
CWebView(QWidget* parent = nullptr);
~CWebView(){};
protected:
void contextMenuEvent(QContextMenuEvent* event);
private:
QMenu* m_pContextMenu;
QAction* m_pBackAct;
QAction* m_pForwardAct;
QAction* m_pReloadAct;
};
#endif // webview_h__
#include "webview.h"
#include <QMenu>
#include <QAction>
#include <QIcon>
#include <QWebEngineHistory>
CWebView::CWebView(QWidget* parent /*= nullptr*/) : QWebEngineView(parent)
{
m_pContextMenu = new QMenu;
m_pBackAct = new QAction(QIcon::fromTheme(QStringLiteral("go-previous")), tr("Back"));
m_pForwardAct = new QAction(QIcon::fromTheme(QStringLiteral("go-next")), tr("Forward"));
m_pReloadAct = new QAction(QIcon::fromTheme(QStringLiteral("view-refresh")), tr("Reload"));
m_pContextMenu->addAction(m_pBackAct);
m_pContextMenu->addAction(m_pForwardAct);
m_pContextMenu->addAction(m_pReloadAct);
connect(m_pBackAct, &QAction::triggered, this, &QWebEngineView::back);
connect(m_pForwardAct, &QAction::triggered, this, &QWebEngineView::forward);
connect(m_pReloadAct, &QAction::triggered, this, &QWebEngineView::reload);
setContextMenuPolicy(Qt::DefaultContextMenu);
}
void CWebView::contextMenuEvent(QContextMenuEvent* event)
{
m_pBackAct->setEnabled(this->history()->canGoBack());
m_pForwardAct->setEnabled(this->history()->canGoForward());
m_pContextMenu->exec(QCursor::pos());
}
最后配置自己的翻译文件即可