通常、QTableView::mousePressEvent( QMouseEvent* ) を再実装すると、これを問題なく動作させることができます。ただし、 QHeaderView で実行してもうまくいきません。コードは簡単です。
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() に空の文字列を渡しています。そのメニューは、どの列がそれを呼び出したかを知ることができず、騒乱がさらに続く.
clicked( const QModelIndex& ) は、正しいインデックスとテキストを教えてくれることを知っています。ただし、ボタンを区別する必要があります。