使用 QAction 和 setToolTip() 时出现 Qt 本地化问题
Posted
技术标签:
【中文标题】使用 QAction 和 setToolTip() 时出现 Qt 本地化问题【英文标题】:Qt Localization issue when using QAction and setToolTip() 【发布时间】:2012-12-19 07:33:37 【问题描述】:我正在尝试为我的 Qt 项目使用土耳其语翻译文件。我使用 Qt Linguist 生成 .ts 文件。问题是当我在我的应用程序中加载翻译文件时,每当我单击 QMenuBar 的任何项目时都会出现分段错误。
我还有一个上下文菜单,它由主窗口中 GraphicsView 的 contextMenuEvent 触发。当我尝试执行以下行时,程序会出现分段错误。
mContextMenu->exec(event->globalPos());
mContextMenu 是一个 QMenu* 并且 exec 返回一个 QAction*。基本上我猜当翻译属于 QAction 时,就会出现这个问题。我在翻译toolButtons的toolTips时看到了同样的问题。我应该如何处理 QActions 和 toolTips 的翻译?
【问题讨论】:
我建议您提供一个显示问题的最小代码示例,因为 exec 行不能是罪魁祸首。 【参考方案1】:我正在向 mContextMenu 添加一些操作,如下所示:
void RadarView::prepareMainMenu()
mContextMenu = new QMenu();
//showLineAction->setShortcut(QKeySequence("Alt+Shift+L"));
mpStartRulerAction = new QAction(QObject::tr("Start Ruler"), this);
mContextMenu->addAction(mpStartRulerAction);
connect(mpStartRulerAction, SIGNAL(triggered()), this,
SLOT(menuStartRulerClicked()));
mpStartRulerAction->setProperty("TYPEVIEW", MV_StartRuler);
mpEndRulerAction = new QAction(QObject::tr("End Ruler"), this);
mContextMenu->addAction(mpEndRulerAction);
connect(mpEndRulerAction, SIGNAL(triggered()), this, SLOT(menuEndRulerClicked()));
mpEndRulerAction->setProperty("TYPEVIEW", MV_EndRuler);
mpCriticalRegionAction = new QAction(QObject::tr("Critical Region"), this);
mContextMenu->addAction(mpCriticalRegionAction);
connect(mpCriticalRegionAction, SIGNAL(triggered()), this, SLOT(menuDefineCriticalRegionClicked()));
mpCriticalRegionAction->setProperty("TYPEVIEW", MV_Critical_Region);
mpAScopeAction = new QAction(QObject::tr("A-Scope Line"), this);
mContextMenu->addAction(mpAScopeAction);
connect(mpAScopeAction, SIGNAL(triggered()), this, SLOT(menuAddAScopeLine()));
mpAScopeAction->setProperty("TYPEVIEW", MV_A_Scope);
图形视图的上下文菜单事件实现如下:
void RadarView::contextMenuEvent(QContextMenuEvent * event)
LOGGER_START
//check if the item has its own context menu...
QList<QGraphicsItem*> items = this->items(event->pos());
if (items.size() != 0)
bool isValid = true;
for (int i = 0; i < items.size(); ++i)
QGraphicsRulerLineItem *rulerLineItem = NULL;
rulerLineItem = dynamic_cast<QGraphicsRulerLineItem*> (items[i]);
if (rulerLineItem != NULL || dynamic_cast<AScopeLineItem*> (items[i]) || dynamic_cast<PpiTargetItem*> (items[i]))
isValid = false;
else
PpiPlotItem *targetItem = NULL;
targetItem = dynamic_cast<PpiPlotItem*> (items[i]);
if (targetItem != NULL)
isValid = false;
if (currentVisibleMenuItems.contains(0))
startItem = targetItem;
else if (currentVisibleMenuItems.contains(1))
endItem = targetItem;
if (isValid == true)
if(currentVisibleMenuItems.size() ==0)
return;
//Get last clicked Position.
mLastClickedPos = event->pos();
//show menu of RadarView...
mpRightClickAction = mContextMenu->exec(event->globalPos());
else
QGraphicsView::contextMenuEvent(event);
LOGGER_END
【讨论】:
【参考方案2】:当我使用 QApplication 而不是继承 QApplication 的自定义类时,我上面描述的问题得到了解决。在自定义类内部,实现了 bool QApplication::notify ( QObject * receiver, QEvent * e ) 函数。当我直接使用 QApplication 时,所有翻译都已正确加载,并且没有出现关于 QAction 项和工具提示的问题。
【讨论】:
以上是关于使用 QAction 和 setToolTip() 时出现 Qt 本地化问题的主要内容,如果未能解决你的问题,请参考以下文章
QAction QActionGroup QMenu 使用方法
Qt 5.4 OS X 如何在 QMenu 和 QToolBar 中使用 QAction,但仅在 QToolbar 中显示图标
QSignalMapper 和 QAction 的问题永远不会触发 Slot