2012-10-23 3 views
0

QTableView :: mousePressEvent (QMouseEvent *)를 다시 구현할 때 일반적으로 아무런 문제없이 작동합니다. 그러나, QHeaderView에서 그것을하는 것은 나를 위해 작동하지 않습니다. 코드는 간단합니다.QHeaderView :: mousePressEvent (열/인덱스를 찾아야 함)

void my_header_t::mousePressEvent(QMouseEvent* event) 
{ 
    if (!event) { 
    return; 
} 

if (event->button() == Qt::RightButton) { 

    QPoint point(event->x(), event->y()); 
    QModelIndex index = indexAt(point); 

    printf("%s data %s %d,%d %s (point: %d,%d)\n", 
     ts().c_str(), index.data().toString().toStdString().c_str(), 
     index.row(), index.column(), index.isValid() ? "True" : "False", 
     event->x(), event->y()); 

    handle_right_click(index.data().toString()); 

} else { 
    QHeaderView::mousePressEvent(event); 
} 

QMouseEvent의 x() 및 y()는 정상입니다. 그러나 row()가 -1이고 column()이 -1 인 잘못된 인덱스를 만듭니다. 분명히, 메뉴를 시작하는 handle_right_click()에 빈 문자열을 전달합니다. 그 메뉴는 그것을 불렀던 열을 알지 않을 것이고, 신체 상해는 계속해서 이어질 것입니다.

나는 (const QModelIndex &) 클릭하면 텍스트와 함께 올바른 색인을 알 수 있다는 것을 알고 있습니다. 그러나 버튼을 구별해야합니다.

답변

3

QHeaderView 당신이 관심있는 헤더 항목의 인덱스를 결정하기위한 대안 기능, logicalIndexAt를 제공 위에서 코드를 사용 :. 헤더의 방향이 전달되어야 함을

void my_header_t::mousePressEvent(QMouseEvent* event) 
{ 
    if (!event) { 
     return; 
    } 

    if (event->button() == Qt::RightButton) { 
     int index = logicalIndexAt(event->pos()); 

     handle_right_click(model()->headerData(index, Qt::Horizontal).toString()); 

    } else { 
     QHeaderView::mousePressEvent(event); 
    } 
} 

headerData 방법 (이 경우 나는 단지 Qt::Horizontal이라고 가정했지만 귀하의 경우에는 다른 것일 수 있습니다).

+0

굉장 - 알았어요. 내가 logicalIndexAt에 대해 알고 ... 왜 그것을 시도하지 않았는지 모르겠다. 다른 사람이 다음을 참조하는 경우에만주의하십시오. QHeaderView는 기본적으로 모든 모델()에 액세스 할 수 없습니다. 내가 상속하는 동안 부모 QTableView에서 모델 (이 경우 실제로는 QSortFilterProxyModel)을 설정하고 저장합니다. 다시 한 번 감사드립니다. –

관련 문제