2014-09-26 28 views
0

QTreeView의 하위 클래스가 있습니다. 특정 항목에 대한 사용자 지정 컨텍스트 메뉴가 필요합니다. I 컨텍스트 메뉴 작성의 위치를 ​​찾기 'onCustomContextMenu "슬롯 함수에서QTreeView의 사용자 지정 컨텍스트 메뉴에 대한 QStandardItem 가져 오기

setContextMenuPolicy(Qt::CustomContextMenu); 

QObject::connect(this, SIGNAL(customContextMenuRequested(const QPoint &)), this, SLOT(onCustomContextMenu(const QPoint &))); 

지금 : I 컨텍스트 메뉴 정책을 설정이하세요 QTreeView의 서브 클래스의 생성자의 신호"customContextMenuRequested "를 연결하려면 QPoint로 이 위치에 표시된 QStandardItem을 얻고 싶습니다.

void t_my_tree_view::onCustomContextMenu(const QPoint &point) 
{ 
    QModelIndex index = this->indexAt(point); 
    QStandardItem* item_ptr = m_item_model->item(index.row, index.column()); 
} 

m_item_model이 QTreeview의 서브 클래스에서 모델입니다 QStandardItemModel에 대한 포인터입니다 : 나는이 시도.

문제는 내가 얻은 "item_ptr"이 때때로 잘못되었거나 NULL이라는 것입니다. 내 모델은 다음과 같습니다 경우는 NULL이됩니다 : | -item_on_level_1
| -item_on_level_2
| -item_on_level_2
|

invisibleRootItem
-item_on_level_2 < -이 오른쪽 클릭이
이었다 항목입니다 | -item_on_level_2

내가 뭘 잘못하고 있니? 내가 rightclick 항목을 어떻게 얻을 수 있습니까?

답변

0

QPoint 좌표를 view->viewport() 좌표로 매핑해야합니다. 당신의 contextMenuRequestTreeItem은 다음 QModelIndex을 선택 실제를 얻을 수 QTreeView::currentIndex()을 사용할 수 선택하면

bool LogDelegate::editorEvent(QEvent* event, QAbstractItemModel* model, QStyleOptionViewItem const& option, QModelIndex const& index) 
{ 
    switch (event->type()) 
    { 
    case QEvent::MouseButtonRelease: 
     { 
      QMouseEvent* me = static_cast<QMouseEvent *>(event); 
      if (me->button() == Qt::RightButton) 
      { 
       QMenu menu; 
       QAction* copy = new QAction("Copy", this); 
       connect(copy, SIGNAL(triggered()), SIGNAL(copyRequest())); 
       menu.addAction(copy); 
       menu.exec(QCursor::pos()); 
       copy->deleteLater(); 
      } 
     } 
     break; 

    default: 
     break; 
    } 

    return QStyledItemDelegate::editorEvent(event, model, option, index); 
} 
1

:

Prefferable 방법은 같은 최우선 editorEvent와 사용자 정의 QStyledItemDelegate을 구현하는 것입니다.

QStandardItemModel::itemFromIndex(const QModelIndex&)을 사용하여 QStandardItem에 대한 포인터를 가져옵니다.

경우에 따라서는 ptr이 null이고 잘 보내야하는지 확인하십시오.