2012-12-19 3 views
1

Qt 프로젝트에 터키어 번역 파일을 사용하려고합니다. .ts 파일을 생성 할 때 Qt Linguist를 사용했습니다. 문제는 응용 프로그램에서 번역 파일을로드 할 때 QMenuBar의 항목을 누를 때마다 세그먼트 화 오류가 발생하는 것입니다.QAction 및 setToolTip()을 사용할 때의 Qt 현지화 문제

메인 윈도우에서 GraphicsView의 contextMenuEvent로 트리거되는 컨텍스트 메뉴도 있습니다. 아래 줄을 실행하려고하면 프로그램에서 세그먼트 오류가 발생합니다.

mContextMenu->exec(event->globalPos()); 

mContextMenu는 QMenu *이고 exec는 QAction *을 반환합니다. 기본적으로 번역이 QAction에 속할 때이 문제가 발생합니다. toolButtons의 툴팁을 번역 할 때도 동일한 문제가 발생했습니다. QActions와 툴팁의 번역은 어떻게 처리해야합니까?

+1

exec 줄이 범인이 될 수 없기 때문에 문제를 보여주는 최소한의 코드 샘플을 작성하는 것이 좋습니다. – ismail

답변

0

위에서 설명한 문제는 QApplication을 사용자 정의 된 클래스 대신 사용할 때 해결됩니다. hertes QApplication. 사용자 정의 된 클래스 내부에서 bool QApplication :: notify (QObject * receiver, QEvent * e) 함수가 구현되었습니다. QApplication을 직접 사용했을 때 모든 번역이 올바르게로드되었고 QAction 항목 및 툴팁과 관련하여 문제가 발생하지 않았습니다.

0

나는 다음과 같이 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 

}

관련 문제